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