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 2018/05/30 14:18:12 UTC

[isis] branch master updated: ISIS-1957: fixes ServiceInjector fails to handle Generic Types

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


The following commit(s) were added to refs/heads/master by this push:
     new dabee19  ISIS-1957: fixes ServiceInjector fails to handle Generic Types
dabee19 is described below

commit dabee1909c58869ca247d318133c564e09d0f7f0
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed May 30 16:17:46 2018 +0200

    ISIS-1957: fixes ServiceInjector fails to handle Generic Types
    
    ... in target fields of type List
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1957
---
 .../applib/services/grid/GridSystemService.java    |  6 ++--
 .../commons/internal/collections/_Collections.java | 12 +++++--
 .../core/metamodel/services/ServicesInjector.java  |  2 +-
 .../services/grid/GridServiceDefault.java          | 38 ++++++++++------------
 .../grid/bootstrap3/GridSystemServiceBS3.java      |  2 +-
 .../core/metamodel/services/grid/BS3GridTest.java  |  2 +-
 6 files changed, 34 insertions(+), 28 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/grid/GridSystemService.java b/core/applib/src/main/java/org/apache/isis/applib/services/grid/GridSystemService.java
index 46e8209..553264d 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/grid/GridSystemService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/grid/GridSystemService.java
@@ -22,13 +22,13 @@ import org.apache.isis.applib.layout.grid.Grid;
 /**
  * Provides an implementation of {@link Grid}.
  */
-public interface GridSystemService<G extends org.apache.isis.applib.layout.grid.Grid> {
+public interface GridSystemService<G extends Grid> {
 
     /**
      * Which grid (implementation) is defined by this service.
      */
     @Programmatic
-    Class<? extends Grid> gridImplementation();
+    Class<G> gridImplementation();
 
     @Programmatic
     String tns();
@@ -37,7 +37,7 @@ public interface GridSystemService<G extends org.apache.isis.applib.layout.grid.
     String schemaLocation();
 
     @Programmatic
-    Grid defaultGrid(Class<?> domainClass);
+    G defaultGrid(Class<?> domainClass);
 
     /**
      * Validate the grid, derive any missing object members, and overwrite any facets in the metamodel based on the
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/collections/_Collections.java b/core/commons/src/main/java/org/apache/isis/commons/internal/collections/_Collections.java
index 38d0725..364d635 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/collections/_Collections.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/collections/_Collections.java
@@ -277,11 +277,20 @@ public final class _Collections {
             final ParameterizedType parameterizedType = (ParameterizedType) genericType;
             final Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
             if(actualTypeArguments.length == 1) {
+            	// handle e.g. List<Sometype>
                 final Type actualTypeArgument = actualTypeArguments[0];
                 if(actualTypeArgument instanceof Class) {
                     final Class<?> actualType = (Class<?>) actualTypeArgument;
                     return actualType;
                 }
+                // also handle e.g. List<Sometype<T>>
+                if(actualTypeArgument instanceof ParameterizedType) {
+                	final Type innerParameterizedType = ((ParameterizedType) actualTypeArgument).getRawType();
+                	if(innerParameterizedType instanceof Class) {
+                        final Class<?> actualType = (Class<?>) innerParameterizedType;
+                        return actualType;
+                    }
+                }
             }
         }
         
@@ -295,8 +304,7 @@ public final class _Collections {
      * @return inferred type or null if inference fails
      */
     public static @Nullable Class<?> inferElementTypeIfAny(@Nullable final Field field) {
-    	        
-        return inferElementTypeIfAny(field.getType(), field.getGenericType());
+    	return inferElementTypeIfAny(field.getType(), field.getGenericType());
     }
     
 	// --
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java
index ea21cb7..83423b4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjector.java
@@ -445,7 +445,7 @@ public class ServicesInjector implements ApplicationScopedComponent {
     // -- REFLECTIVE PREDICATES
     
     private static final Predicate<Object> isOfType(final Class<?> cls) {
-        return obj->cls.isAssignableFrom(obj.getClass());
+    	return obj->cls.isAssignableFrom(obj.getClass());
     }
     
     private static final Predicate<Method> nameStartsWith(final String prefix) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
index 90a984f..09a294c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
@@ -20,14 +20,6 @@ import java.util.List;
 
 import javax.annotation.Nullable;
 
-import com.google.common.base.Joiner;
-import com.google.common.base.Predicate;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.Lists;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
@@ -35,6 +27,12 @@ import org.apache.isis.applib.layout.grid.Grid;
 import org.apache.isis.applib.services.grid.GridLoaderService;
 import org.apache.isis.applib.services.grid.GridService;
 import org.apache.isis.applib.services.grid.GridSystemService;
+import org.apache.isis.commons.internal.base._Casts;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Predicate;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.Lists;
 
 @DomainService(
         nature = NatureOfService.DOMAIN,
@@ -42,7 +40,7 @@ import org.apache.isis.applib.services.grid.GridSystemService;
 )
 public class GridServiceDefault implements GridService {
 
-    private static final Logger LOG = LoggerFactory.getLogger(GridServiceDefault.class);
+    //private static final Logger LOG = LoggerFactory.getLogger(GridServiceDefault.class);
 
     public static final String COMPONENT_TNS = "http://isis.apache.org/applib/layout/component";
     public static final String COMPONENT_SCHEMA_LOCATION = "http://isis.apache.org/applib/layout/component/component.xsd";
@@ -80,7 +78,7 @@ public class GridServiceDefault implements GridService {
     @Programmatic
     public Grid defaultGridFor(Class<?> domainClass) {
 
-        for (GridSystemService gridSystemService : gridSystemServices()) {
+        for (GridSystemService<?> gridSystemService : gridSystemServices()) {
             Grid grid = gridSystemService.defaultGrid(domainClass);
             if(grid != null) {
                 return grid;
@@ -98,8 +96,8 @@ public class GridServiceDefault implements GridService {
 
         final Class<?> domainClass = grid.getDomainClass();
 
-        for (GridSystemService gridSystemService : gridSystemServices()) {
-            gridSystemService.normalize(grid, domainClass);
+        for (GridSystemService<?> gridSystemService : gridSystemServices()) {
+            gridSystemService.normalize(_Casts.uncheckedCast(grid), domainClass);
         }
 
         final String tnsAndSchemaLocation = tnsAndSchemaLocation(grid);
@@ -115,8 +113,8 @@ public class GridServiceDefault implements GridService {
     public Grid complete(final Grid grid) {
 
         final Class<?> domainClass = grid.getDomainClass();
-        for (GridSystemService gridSystemService : gridSystemServices()) {
-            gridSystemService.complete(grid, domainClass);
+        for (GridSystemService<?> gridSystemService : gridSystemServices()) {
+            gridSystemService.complete(_Casts.uncheckedCast(grid), domainClass);
         }
 
         return grid;
@@ -127,8 +125,8 @@ public class GridServiceDefault implements GridService {
     public Grid minimal(final Grid grid) {
 
         final Class<?> domainClass = grid.getDomainClass();
-        for (GridSystemService gridSystemService : gridSystemServices()) {
-            gridSystemService.minimal(grid, domainClass);
+        for (GridSystemService<?> gridSystemService : gridSystemServices()) {
+            gridSystemService.minimal(_Casts.uncheckedCast(grid), domainClass);
         }
 
         return grid;
@@ -148,7 +146,7 @@ public class GridServiceDefault implements GridService {
         parts.add(LINKS_TNS);
         parts.add(LINKS_SCHEMA_LOCATION);
 
-        for (GridSystemService gridSystemService : gridSystemServices) {
+        for (GridSystemService<?> gridSystemService : gridSystemServices) {
             final Class<? extends Grid> gridImpl = gridSystemService.gridImplementation();
             if(gridImpl.isAssignableFrom(grid.getClass())) {
                 parts.add(gridSystemService.tns());
@@ -177,8 +175,8 @@ public class GridServiceDefault implements GridService {
         if (filteredGridSystemServices == null) {
             List<GridSystemService<?>> services = Lists.newArrayList();
 
-            for (GridSystemService gridSystemService : this.gridSystemServices) {
-                final Class gridImplementation = gridSystemService.gridImplementation();
+            for (GridSystemService<?> gridSystemService : this.gridSystemServices) {
+                final Class<?> gridImplementation = gridSystemService.gridImplementation();
                 final boolean notSeenBefore = FluentIterable.from(services).filter(new Predicate<GridSystemService<?>>() {
                     @Override public boolean apply(@Nullable final GridSystemService<?> systemService) {
                         return systemService.gridImplementation() == gridImplementation;
@@ -203,6 +201,6 @@ public class GridServiceDefault implements GridService {
     GridLoaderService gridLoaderService;
 
     @javax.inject.Inject
-    List<GridSystemService> gridSystemServices;
+    List<GridSystemService<?>> gridSystemServices;
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java
index ac7c725..5046de8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/bootstrap3/GridSystemServiceBS3.java
@@ -83,7 +83,7 @@ public class GridSystemServiceBS3 extends GridSystemServiceAbstract<BS3Grid> {
 
     @Programmatic
     @Override
-    public Grid defaultGrid(final Class<?> domainClass) {
+    public BS3Grid defaultGrid(final Class<?> domainClass) {
         final BS3Grid bs3Grid = new BS3Grid();
 
         final ObjectSpecification objectSpec = specificationLoader.loadSpecification(domainClass);
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/grid/BS3GridTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/grid/BS3GridTest.java
index 87e6fec..4cc59e3 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/grid/BS3GridTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/grid/BS3GridTest.java
@@ -59,7 +59,7 @@ public class BS3GridTest {
         jaxbService = new JaxbService.Simple();
         gridServiceDefault = new GridServiceDefault();
         gridSystemServiceBS3 = new GridSystemServiceBS3();
-        gridServiceDefault.gridSystemServices = Arrays.<GridSystemService>asList(
+        gridServiceDefault.gridSystemServices = Arrays.<GridSystemService<?>>asList(
                 gridSystemServiceBS3);
     }
 

-- 
To stop receiving notification emails like this one, please contact
ahuber@apache.org.