You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2017/01/19 11:09:19 UTC

[13/24] isis git commit: ISIS-785: moves logic for inferring generic return types from ActionAnnotationFacetFactory into SpecificationLoader, since will want to do something similar for the FacetedMethodParameter which represents a Collection.

ISIS-785: moves logic for inferring generic return types from ActionAnnotationFacetFactory into SpecificationLoader, since will want to do something similar for the FacetedMethodParameter which represents a Collection<T>.

Currently the FacetedMethodPeer does not hold a TypeOfFacet (unlike the FacetedMethod underpinning a OneToManyAssociation, which does); this means that we don't know what the <T> is for an action "foo(Collection<T> xxx)", we simply see "foo(Collection xxx)"


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/449f5698
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/449f5698
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/449f5698

Branch: refs/heads/maint-1.13.3
Commit: 449f56983bf21c1ffa7c0b434164c6448b3ba368
Parents: 5b18209
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Jan 18 12:01:09 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 12:01:09 2017 +0000

----------------------------------------------------------------------
 .../core/metamodel/facets/FacetedMethod.java    | 10 ++++
 .../action/ActionAnnotationFacetFactory.java    | 53 ++---------------
 .../specloader/SpecificationLoader.java         | 62 ++++++++++++++++++++
 3 files changed, 77 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/449f5698/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethod.java
index ebaa21d..cae44d3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethod.java
@@ -93,6 +93,16 @@ public class FacetedMethod extends TypedHolderDefault implements IdentifiedHolde
         final List<FacetedMethodParameter> actionParams = Lists.newArrayList();
         for (final Class<?> parameterType : parameterTypes) {
             actionParams.add(new FacetedMethodParameter(declaringType, actionMethod, parameterType));
+
+            // this is based on similar logic to ActionAnnotationFacetFactory#processTypeOf
+            if (org.apache.isis.core.metamodel.specloader.CollectionUtils.isCollectionType(parameterType)) {
+
+            } else if (org.apache.isis.core.metamodel.specloader.CollectionUtils.isArrayType(parameterType)) {
+
+            } else {
+                continue;
+            }
+
         }
         return Collections.unmodifiableList(actionParams);
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/449f5698/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
index 1bb357e..7b58bac 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
@@ -19,11 +19,7 @@
 
 package org.apache.isis.core.metamodel.facets.actions.action;
 
-import java.lang.reflect.GenericDeclaration;
 import java.lang.reflect.Method;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.lang.reflect.TypeVariable;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionInteraction;
@@ -51,7 +47,6 @@ import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromArray;
-import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromGenerics;
 import org.apache.isis.core.metamodel.facets.actions.action.bulk.BulkFacetObjectOnly;
 import org.apache.isis.core.metamodel.facets.actions.action.bulk.BulkFacetForActionAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.bulk.BulkFacetForBulkAnnotation;
@@ -90,6 +85,7 @@ import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacet;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.CollectionUtils;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorForDeprecatedAnnotation;
 import org.apache.isis.core.metamodel.util.EventUtil;
@@ -462,52 +458,13 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract
     private TypeOfFacet inferFromGenericReturnType(
             final ProcessMethodContext processMethodContext) {
 
+        final Class<?> cls = processMethodContext.getCls();
         final Method method = processMethodContext.getMethod();
-        final FacetedMethod holder = processMethodContext.getFacetHolder();
-
-        final Type type = method.getGenericReturnType();
-        if (!(type instanceof ParameterizedType)) {
-            return null;
-        }
-
-        final ParameterizedType methodParameterizedType = (ParameterizedType) type;
-        final Type[] methodActualTypeArguments = methodParameterizedType.getActualTypeArguments();
-
-        if (methodActualTypeArguments.length == 0) {
-            return null;
-        }
+        final FacetHolder holder = processMethodContext.getFacetHolder();
 
-        final Object methodActualTypeArgument = methodActualTypeArguments[0];
-        if (methodActualTypeArgument instanceof Class) {
-            final Class<?> actualType = (Class<?>) methodActualTypeArgument;
-            return new TypeOfFacetInferredFromGenerics(actualType, holder, getSpecificationLoader());
-        }
+        final SpecificationLoader specificationLoader = getSpecificationLoader();
 
-        if (methodActualTypeArgument instanceof TypeVariable) {
-
-            final TypeVariable<?> methodTypeVariable = (TypeVariable<?>) methodActualTypeArgument;
-            final GenericDeclaration methodGenericClassDeclaration = methodTypeVariable.getGenericDeclaration();
-
-            // try to match up with the actual type argument of the generic superclass.
-            final Type genericSuperclass = processMethodContext.getCls().getGenericSuperclass();
-            if(genericSuperclass instanceof ParameterizedType) {
-                final ParameterizedType parameterizedTypeOfSuperclass = (ParameterizedType)genericSuperclass;
-                if(parameterizedTypeOfSuperclass.getRawType() == methodGenericClassDeclaration) {
-                    final Type[] genericSuperClassActualTypeArguments = parameterizedTypeOfSuperclass.getActualTypeArguments();
-                    // simplification: if there's just one, then use it.
-                    if(methodActualTypeArguments.length == 1) {
-                        final Type actualType = genericSuperClassActualTypeArguments[0];
-                        if(actualType instanceof Class) {
-                            // just being safe
-                            final Class<?> actualCls = (Class<?>) actualType;
-                            return new TypeOfFacetInferredFromGenerics(actualCls, holder, getSpecificationLoader());
-                        }
-                    }
-                }
-            }
-            // otherwise, what to do?
-        }
-        return null;
+        return specificationLoader.inferFromGenericReturnType(cls, method, holder);
     }
 
     // ///////////////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/449f5698/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
----------------------------------------------------------------------
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 d5791d1..64e3251 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
@@ -16,6 +16,11 @@
  */
 package org.apache.isis.core.metamodel.specloader;
 
+import java.lang.reflect.GenericDeclaration;
+import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -38,7 +43,10 @@ import org.apache.isis.core.commons.ensure.Assert;
 import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.commons.lang.ClassUtil;
 import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
+import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
+import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromGenerics;
 import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet;
 import org.apache.isis.core.metamodel.facets.object.objectspecid.ObjectSpecIdFacet;
 import org.apache.isis.core.metamodel.layoutmetadata.LayoutMetadataReader;
@@ -517,6 +525,60 @@ public class SpecificationLoader implements ApplicationScopedComponent {
         return objectSpecification;
     }
 
+
+    //endregion
+
+    //region > inferFromGenericReturnType
+
+    @Programmatic
+    public TypeOfFacet inferFromGenericReturnType(
+            final Class<?> cls,
+            final Method method,
+            final FacetHolder holder) {
+        final Type type = method.getGenericReturnType();
+        if (!(type instanceof ParameterizedType)) {
+            return null;
+        }
+
+        final ParameterizedType methodParameterizedType = (ParameterizedType) type;
+        final Type[] methodActualTypeArguments = methodParameterizedType.getActualTypeArguments();
+
+        if (methodActualTypeArguments.length == 0) {
+            return null;
+        }
+
+        final Object methodActualTypeArgument = methodActualTypeArguments[0];
+        if (methodActualTypeArgument instanceof Class) {
+            final Class<?> actualType = (Class<?>) methodActualTypeArgument;
+            return new TypeOfFacetInferredFromGenerics(actualType, holder, this);
+        }
+
+        if (methodActualTypeArgument instanceof TypeVariable) {
+
+            final TypeVariable<?> methodTypeVariable = (TypeVariable<?>) methodActualTypeArgument;
+            final GenericDeclaration methodGenericClassDeclaration = methodTypeVariable.getGenericDeclaration();
+
+            // try to match up with the actual type argument of the generic superclass.
+            final Type genericSuperclass = cls.getGenericSuperclass();
+            if(genericSuperclass instanceof ParameterizedType) {
+                final ParameterizedType parameterizedTypeOfSuperclass = (ParameterizedType)genericSuperclass;
+                if(parameterizedTypeOfSuperclass.getRawType() == methodGenericClassDeclaration) {
+                    final Type[] genericSuperClassActualTypeArguments = parameterizedTypeOfSuperclass.getActualTypeArguments();
+                    // simplification: if there's just one, then use it.
+                    if(methodActualTypeArguments.length == 1) {
+                        final Type actualType = genericSuperClassActualTypeArguments[0];
+                        if(actualType instanceof Class) {
+                            // just being safe
+                            final Class<?> actualCls = (Class<?>) actualType;
+                            return new TypeOfFacetInferredFromGenerics(actualCls, holder, this);
+                        }
+                    }
+                }
+            }
+            // otherwise, what to do?
+        }
+        return null;
+    }
     //endregion