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 <ahu...@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 ahu...@apache.org.