From 32bda65bcf207f61e4671ab94d847a6863ac5f01 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 15 Oct 2014 11:56:39 +0200 Subject: [PATCH] DATAREST-385 - Projection definition configurations are now detected for super types. Projections defined for a parent type are now also available for sub-types. --- .../ProjectionDefinitionConfiguration.java | 6 ++--- ...ctionDefinitionConfigurationUnitTests.java | 22 +++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/config/ProjectionDefinitionConfiguration.java b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/config/ProjectionDefinitionConfiguration.java index 03147f335..94612a1bc 100644 --- a/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/config/ProjectionDefinitionConfiguration.java +++ b/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/config/ProjectionDefinitionConfiguration.java @@ -124,7 +124,7 @@ public class ProjectionDefinitionConfiguration implements ProjectionDefinitions */ @Override public Class getProjectionType(Class sourceType, String name) { - return projectionDefinitions.get(new ProjectionDefinitionKey(sourceType, name)); + return getProjectionsFor(sourceType).get(name); } /* @@ -135,7 +135,7 @@ public class ProjectionDefinitionConfiguration implements ProjectionDefinitions public boolean hasProjectionFor(Class sourceType) { for (ProjectionDefinitionKey key : projectionDefinitions.keySet()) { - if (key.sourceType.equals(sourceType)) { + if (key.sourceType.isAssignableFrom(sourceType)) { return true; } } @@ -156,7 +156,7 @@ public class ProjectionDefinitionConfiguration implements ProjectionDefinitions Map> result = new HashMap>(); for (Entry> entry : projectionDefinitions.entrySet()) { - if (entry.getKey().sourceType.equals(sourceType)) { + if (entry.getKey().sourceType.isAssignableFrom(sourceType)) { result.put(entry.getKey().name, entry.getValue()); } } diff --git a/spring-data-rest-core/src/test/java/org/springframework/data/rest/core/config/ProjectionDefinitionConfigurationUnitTests.java b/spring-data-rest-core/src/test/java/org/springframework/data/rest/core/config/ProjectionDefinitionConfigurationUnitTests.java index f89f08965..1868ace77 100644 --- a/spring-data-rest-core/src/test/java/org/springframework/data/rest/core/config/ProjectionDefinitionConfigurationUnitTests.java +++ b/spring-data-rest-core/src/test/java/org/springframework/data/rest/core/config/ProjectionDefinitionConfigurationUnitTests.java @@ -135,6 +135,21 @@ public class ProjectionDefinitionConfigurationUnitTests { assertThat(objectOtherNameKey, is(not(objectNameKey))); } + /** + * @see DATAREST-385 + */ + @Test + public void returnsProjectionForParentClass() { + + ProjectionDefinitionConfiguration configuration = new ProjectionDefinitionConfiguration(); + configuration.addProjection(ParentProjection.class); + + assertThat(configuration.hasProjectionFor(Child.class), is(true)); + assertThat(configuration.getProjectionsFor(Child.class).values(), hasItem(ParentProjection.class)); + assertThat(configuration.getProjectionType(Child.class, "parentProjection"), + is(typeCompatibleWith(ParentProjection.class))); + } + @Projection(name = "name", types = Integer.class) interface SampleProjection { @@ -144,4 +159,11 @@ public class ProjectionDefinitionConfigurationUnitTests { interface Default { } + + class Parent {} + + class Child extends Parent {} + + @Projection(types = Parent.class) + interface ParentProjection {} }