From 536c6145243a42db14d1b1afa30e5a556070cdf3 Mon Sep 17 00:00:00 2001 From: Dilip Krishnan Date: Thu, 7 Dec 2017 04:05:10 -0600 Subject: [PATCH 1/2] Upgrading dependencies (18) --- build.gradle | 3 ++- springfox-grails-contract-tests/build.gradle | 4 ++-- springfox-grails/build.gradle | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index c058723..7f51a1b 100644 --- a/build.gradle +++ b/build.gradle @@ -4,14 +4,15 @@ plugins { } allprojects { + apply plugin: 'com.github.ben-manes.versions' group = 'io.springfox.grails' version = '1.0.1-SNAPSHOT' repositories { jcenter() - maven { url 'http://oss.jfrog.org/artifactory/oss-snapshot-local/' } mavenCentral() + maven { url 'http://oss.jfrog.org/artifactory/oss-snapshot-local/' } } ext { diff --git a/springfox-grails-contract-tests/build.gradle b/springfox-grails-contract-tests/build.gradle index a034397..073c4d8 100644 --- a/springfox-grails-contract-tests/build.gradle +++ b/springfox-grails-contract-tests/build.gradle @@ -5,8 +5,8 @@ buildscript { } dependencies { classpath "org.grails:grails-gradle-plugin:$grailsVersion" - classpath "org.grails.plugins:hibernate5:6.0.2" - classpath "org.grails.plugins:views-gradle:1.1.1" + classpath "org.grails.plugins:hibernate5:6.1.8" + classpath "org.grails.plugins:views-gradle:1.2.6" } } diff --git a/springfox-grails/build.gradle b/springfox-grails/build.gradle index aba4d69..8277913 100644 --- a/springfox-grails/build.gradle +++ b/springfox-grails/build.gradle @@ -51,6 +51,7 @@ dependencies { testCompile "org.codehaus.groovy:groovy-all:${groovy}" testCompile "org.grails:grails-plugin-testing:${grails}" testCompile "org.grails:grails-plugin-rest:${grails}" + testCompile "org.grails:grails-gsp:3.2.11" provided "io.swagger:swagger-annotations:${swagger2Core}" provided "org.springframework:spring-core:$spring" From 46c8a05b175ccd6a0065d1cac5b71dccb8d76c43 Mon Sep 17 00:00:00 2001 From: Dilip Krishnan Date: Tue, 2 Jan 2018 05:21:27 -0600 Subject: [PATCH 2/2] WIP --- build.gradle | 7 +- springfox-grails-contract-tests/build.gradle | 1 + .../gradle.properties | 2 +- .../springfox/sample/SpringFoxSpec.groovy | 2 +- springfox-grails/build.gradle | 6 +- .../grails/ActionSpecificationFactory.java | 10 +- ...aultGrailsAlternateTypeRuleConvention.java | 7 +- .../grails/DefaultGrailsPropertySelector.java | 6 +- .../DefaultGrailsPropertyTransformer.java | 19 ++-- .../grails/GrailsActionContext.java | 8 +- .../grails/GrailsPropertySelector.java | 4 +- .../grails/GrailsPropertyTransformer.java | 4 +- .../grails/GrailsRequestHandler.java | 2 +- .../grails/GrailsRequestHandlerProvider.java | 9 +- .../GrailsSerializationTypeGenerator.java | 9 +- .../documentation/grails/UrlMappings.java | 30 +++--- .../ActionSpecificationFactorySpec.groovy | 11 ++- .../documentation/grails/ActionsSpec.groovy | 4 +- ...ailsAlternateTypeRuleConventionSpec.groovy | 28 ++++-- .../DefaultGrailsPropertySelectorSpec.groovy | 55 ++++++++--- ...efaultGrailsPropertyTransformerSpec.groovy | 91 +++++++++++-------- .../grails/GrailsActionContextSpec.groovy | 10 +- 22 files changed, 193 insertions(+), 132 deletions(-) diff --git a/build.gradle b/build.gradle index 7f51a1b..53bc882 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,8 @@ allprojects { repositories { jcenter() mavenCentral() - maven { url 'http://oss.jfrog.org/artifactory/oss-snapshot-local/' } + maven { url "https://repo.grails.org/grails/core" } +// maven { url 'http://oss.jfrog.org/artifactory/oss-snapshot-local/' } } ext { @@ -21,7 +22,7 @@ allprojects { classmate = "1.3.4" groovy = "2.4.8" guava = "20.0" - grails = "3.2.4" + grails = "3.3.2" jackson = '2.7.7' joda = "2.9.4" jsonPath = "2.4.0" @@ -32,7 +33,7 @@ allprojects { slf4j = "1.7.22" snakeyaml = '1.19' spock = "1.1-groovy-2.4" - spring = "4.2.8.RELEASE" + spring = "4.2.9.RELEASE" springHateoas = "0.21.0.RELEASE" springPluginVersion = "1.2.0.RELEASE" swagger2Core = "1.5.12" diff --git a/springfox-grails-contract-tests/build.gradle b/springfox-grails-contract-tests/build.gradle index 073c4d8..133afed 100644 --- a/springfox-grails-contract-tests/build.gradle +++ b/springfox-grails-contract-tests/build.gradle @@ -66,6 +66,7 @@ dependencies { runtime "com.h2database:h2" testCompile "org.grails:grails-plugin-testing" + testCompile "org.grails:grails-web-testing-support" testCompile "org.grails.plugins:geb" testCompile "org.grails:grails-datastore-rest-client" testCompile 'io.rest-assured:rest-assured:3.0.6' diff --git a/springfox-grails-contract-tests/gradle.properties b/springfox-grails-contract-tests/gradle.properties index fad431a..e74af8f 100644 --- a/springfox-grails-contract-tests/gradle.properties +++ b/springfox-grails-contract-tests/gradle.properties @@ -1,2 +1,2 @@ -grailsVersion=3.2.4 +grailsVersion=3.3.2 gradleWrapperVersion=3.0 diff --git a/springfox-grails-contract-tests/src/integration-test/groovy/grails/springfox/sample/SpringFoxSpec.groovy b/springfox-grails-contract-tests/src/integration-test/groovy/grails/springfox/sample/SpringFoxSpec.groovy index f802bb9..fbef049 100644 --- a/springfox-grails-contract-tests/src/integration-test/groovy/grails/springfox/sample/SpringFoxSpec.groovy +++ b/springfox-grails-contract-tests/src/integration-test/groovy/grails/springfox/sample/SpringFoxSpec.groovy @@ -1,6 +1,6 @@ package grails.springfox.sample -import grails.test.mixin.integration.Integration +import grails.testing.mixin.integration.Integration import groovy.json.JsonOutput import org.junit.Assert import org.skyscreamer.jsonassert.JSONAssert diff --git a/springfox-grails/build.gradle b/springfox-grails/build.gradle index 8277913..ad2cf71 100644 --- a/springfox-grails/build.gradle +++ b/springfox-grails/build.gradle @@ -18,10 +18,10 @@ buildscript { maven { url "https://plugins.gradle.org/m2/" } + maven { url "https://repo.grails.org/grails/core" } jcenter() mavenCentral() } - } plugins { @@ -49,9 +49,9 @@ dependencies { testCompile "org.spockframework:spock-spring:${spock}" testCompile "org.spockframework:spock-core:${spock}" testCompile "org.codehaus.groovy:groovy-all:${groovy}" - testCompile "org.grails:grails-plugin-testing:${grails}" + testCompile "org.grails:grails-web-testing-support:1.1.3" testCompile "org.grails:grails-plugin-rest:${grails}" - testCompile "org.grails:grails-gsp:3.2.11" + testCompile "org.grails:grails-gsp:3.3.0" provided "io.swagger:swagger-annotations:${swagger2Core}" provided "org.springframework:spring-core:$spring" diff --git a/springfox-grails/src/main/java/springfox/documentation/grails/ActionSpecificationFactory.java b/springfox-grails/src/main/java/springfox/documentation/grails/ActionSpecificationFactory.java index 830e13f..1057dd2 100644 --- a/springfox-grails/src/main/java/springfox/documentation/grails/ActionSpecificationFactory.java +++ b/springfox-grails/src/main/java/springfox/documentation/grails/ActionSpecificationFactory.java @@ -1,17 +1,17 @@ package springfox.documentation.grails; -import grails.core.GrailsDomainClass; +import org.grails.datastore.mapping.model.PersistentEntity; @FunctionalInterface public interface ActionSpecificationFactory { - default Class idType(GrailsDomainClass domain) { - return domain != null ? domain.getIdentifier().getType() : Void.TYPE; + default Class idType(PersistentEntity domain) { + return domain != null ? domain.getIdentity().getType() : Void.TYPE; } - default Class domainClass(GrailsDomainClass domain) { + default Class domainClass(PersistentEntity domain) { if (domain != null) { - return domain.getClazz(); + return domain.getJavaClass(); } return Void.TYPE; } diff --git a/springfox-grails/src/main/java/springfox/documentation/grails/DefaultGrailsAlternateTypeRuleConvention.java b/springfox-grails/src/main/java/springfox/documentation/grails/DefaultGrailsAlternateTypeRuleConvention.java index 7fdb8f0..0d8def1 100644 --- a/springfox-grails/src/main/java/springfox/documentation/grails/DefaultGrailsAlternateTypeRuleConvention.java +++ b/springfox-grails/src/main/java/springfox/documentation/grails/DefaultGrailsAlternateTypeRuleConvention.java @@ -35,11 +35,10 @@ public DefaultGrailsAlternateTypeRuleConvention( @Override public List rules() { - return Arrays.stream(application.getArtefacts("Domain")) - .filter(GrailsDomainClass.class::isInstance) + return application.getMappingContext().getPersistentEntities().stream() .map(domain -> newRule( - domain.getClazz(), - resolver.resolve(typeGenerator.from((GrailsDomainClass) domain)), getOrder())) + domain.getJavaClass(), + resolver.resolve(typeGenerator.from(domain)), getOrder())) .collect(Collectors.toList()); } diff --git a/springfox-grails/src/main/java/springfox/documentation/grails/DefaultGrailsPropertySelector.java b/springfox-grails/src/main/java/springfox/documentation/grails/DefaultGrailsPropertySelector.java index 6fc49cc..088c940 100644 --- a/springfox-grails/src/main/java/springfox/documentation/grails/DefaultGrailsPropertySelector.java +++ b/springfox-grails/src/main/java/springfox/documentation/grails/DefaultGrailsPropertySelector.java @@ -1,12 +1,12 @@ package springfox.documentation.grails; import com.google.common.base.Objects; -import grails.core.GrailsDomainClassProperty; +import org.grails.datastore.mapping.model.PersistentProperty; public class DefaultGrailsPropertySelector implements GrailsPropertySelector { @Override - public boolean test(GrailsDomainClassProperty each) { - return each.getReferencedDomainClass() == null + public boolean test(PersistentProperty each) { + return each.getOwner().getAssociations().stream().noneMatch(a -> a.getName().equals(each.getName())) && !Objects.equal(each.getName(), "version"); } } diff --git a/springfox-grails/src/main/java/springfox/documentation/grails/DefaultGrailsPropertyTransformer.java b/springfox-grails/src/main/java/springfox/documentation/grails/DefaultGrailsPropertyTransformer.java index 90865f0..1087f30 100644 --- a/springfox-grails/src/main/java/springfox/documentation/grails/DefaultGrailsPropertyTransformer.java +++ b/springfox-grails/src/main/java/springfox/documentation/grails/DefaultGrailsPropertyTransformer.java @@ -1,29 +1,24 @@ package springfox.documentation.grails; -import grails.core.GrailsDomainClassProperty; +import org.grails.datastore.mapping.model.PersistentProperty; import springfox.documentation.builders.AlternateTypePropertyBuilder; public class DefaultGrailsPropertyTransformer implements GrailsPropertyTransformer { @Override - public AlternateTypePropertyBuilder apply(GrailsDomainClassProperty property) { - Class type = property.getReferencedPropertyType(); - if (!property.isPersistent() && property.getName().endsWith("Id")) { - type = relatedDomainIdentifierType(relatedDomainProperty(property)); - } - + public AlternateTypePropertyBuilder apply(PersistentProperty property) { return new AlternateTypePropertyBuilder() .withName(property.getName()) - .withType(type) + .withType(property.getType()) .withCanRead(true) .withCanWrite(true); } - private Class relatedDomainIdentifierType(GrailsDomainClassProperty property) { - return property.getDomainClass().getIdentifier().getType(); + private Class relatedDomainIdentifierType(PersistentProperty property) { + return property.getOwner().getIdentity().getType(); } - private GrailsDomainClassProperty relatedDomainProperty(GrailsDomainClassProperty property) { + private PersistentProperty relatedDomainProperty(PersistentProperty property) { String entityPropertyName = property.getName().replace("Id", ""); - return property.getDomainClass().getPropertyByName(entityPropertyName); + return property.getOwner().getPropertyByName(entityPropertyName); } } diff --git a/springfox-grails/src/main/java/springfox/documentation/grails/GrailsActionContext.java b/springfox-grails/src/main/java/springfox/documentation/grails/GrailsActionContext.java index a5231ca..dcd460e 100644 --- a/springfox-grails/src/main/java/springfox/documentation/grails/GrailsActionContext.java +++ b/springfox-grails/src/main/java/springfox/documentation/grails/GrailsActionContext.java @@ -3,8 +3,8 @@ import com.fasterxml.classmate.TypeResolver; import com.google.common.collect.ImmutableSet; import grails.core.GrailsControllerClass; -import grails.core.GrailsDomainClass; import grails.web.mapping.UrlMapping; +import org.grails.datastore.mapping.model.PersistentEntity; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.method.HandlerMethod; @@ -22,7 +22,7 @@ class GrailsActionContext { private final GrailsControllerClass controller; - private final GrailsDomainClass domainClass; + private final PersistentEntity domainClass; private final GrailsActionAttributes urlProvider; private final String action; private final TypeResolver resolver; @@ -34,7 +34,7 @@ class GrailsActionContext { public GrailsActionContext( GrailsControllerClass controller, - GrailsDomainClass domainClass, + PersistentEntity domainClass, GrailsActionAttributes urlProvider, String action, TypeResolver resolver) { @@ -70,7 +70,7 @@ public GrailsControllerClass getController() { return controller; } - public GrailsDomainClass getDomainClass() { + public PersistentEntity getDomainClass() { return domainClass; } diff --git a/springfox-grails/src/main/java/springfox/documentation/grails/GrailsPropertySelector.java b/springfox-grails/src/main/java/springfox/documentation/grails/GrailsPropertySelector.java index f9e0d32..996c4fd 100644 --- a/springfox-grails/src/main/java/springfox/documentation/grails/GrailsPropertySelector.java +++ b/springfox-grails/src/main/java/springfox/documentation/grails/GrailsPropertySelector.java @@ -1,8 +1,8 @@ package springfox.documentation.grails; -import grails.core.GrailsDomainClassProperty; +import org.grails.datastore.mapping.model.PersistentProperty; import java.util.function.Predicate; -public interface GrailsPropertySelector extends Predicate { +public interface GrailsPropertySelector extends Predicate { } diff --git a/springfox-grails/src/main/java/springfox/documentation/grails/GrailsPropertyTransformer.java b/springfox-grails/src/main/java/springfox/documentation/grails/GrailsPropertyTransformer.java index 867972b..a4f4065 100644 --- a/springfox-grails/src/main/java/springfox/documentation/grails/GrailsPropertyTransformer.java +++ b/springfox-grails/src/main/java/springfox/documentation/grails/GrailsPropertyTransformer.java @@ -1,10 +1,10 @@ package springfox.documentation.grails; -import grails.core.GrailsDomainClassProperty; +import org.grails.datastore.mapping.model.PersistentProperty; import springfox.documentation.builders.AlternateTypePropertyBuilder; import java.util.function.Function; public interface GrailsPropertyTransformer - extends Function { + extends Function { } diff --git a/springfox-grails/src/main/java/springfox/documentation/grails/GrailsRequestHandler.java b/springfox-grails/src/main/java/springfox/documentation/grails/GrailsRequestHandler.java index f9d292c..563e61c 100644 --- a/springfox-grails/src/main/java/springfox/documentation/grails/GrailsRequestHandler.java +++ b/springfox-grails/src/main/java/springfox/documentation/grails/GrailsRequestHandler.java @@ -60,7 +60,7 @@ public String getName() { .map(domain -> String.format( "%s%s", actionContext.getAction(), - capitalize(domain.getLogicalPropertyName()))) + capitalize(domain.getName()))) .orElse(actionContext.getAction()); } diff --git a/springfox-grails/src/main/java/springfox/documentation/grails/GrailsRequestHandlerProvider.java b/springfox-grails/src/main/java/springfox/documentation/grails/GrailsRequestHandlerProvider.java index 03c3722..8e39390 100644 --- a/springfox-grails/src/main/java/springfox/documentation/grails/GrailsRequestHandlerProvider.java +++ b/springfox-grails/src/main/java/springfox/documentation/grails/GrailsRequestHandlerProvider.java @@ -4,7 +4,8 @@ import grails.core.GrailsApplication; import grails.core.GrailsClass; import grails.core.GrailsControllerClass; -import grails.core.GrailsDomainClass; +import org.grails.datastore.mapping.model.MappingContext; +import org.grails.datastore.mapping.model.PersistentEntity; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import springfox.documentation.RequestHandler; @@ -36,6 +37,7 @@ public GrailsRequestHandlerProvider( this.urlProvider = urlProvider; this.grailsApplication = grailsApplication; this.actionResolver = actionResolver; + grailsApplication.initialise(); } @Override @@ -46,8 +48,9 @@ public List requestHandlers() { } private Stream fromGrailsAction(GrailsClass grailsClass) { - GrailsDomainClass inferredDomain = (GrailsDomainClass) Arrays.stream(grailsApplication.getArtefacts("Domain")) - .filter(d -> Objects.equals(d.getLogicalPropertyName(), grailsClass.getLogicalPropertyName())) + PersistentEntity inferredDomain = grailsApplication.getMappingContext() + .getPersistentEntities().stream() + .filter(d -> Objects.equals(d.getName(), grailsClass.getLogicalPropertyName())) .findFirst() .orElse(null); GrailsControllerClass controller = (GrailsControllerClass) grailsClass; diff --git a/springfox-grails/src/main/java/springfox/documentation/grails/GrailsSerializationTypeGenerator.java b/springfox-grails/src/main/java/springfox/documentation/grails/GrailsSerializationTypeGenerator.java index d132cbc..29bd870 100644 --- a/springfox-grails/src/main/java/springfox/documentation/grails/GrailsSerializationTypeGenerator.java +++ b/springfox-grails/src/main/java/springfox/documentation/grails/GrailsSerializationTypeGenerator.java @@ -1,12 +1,11 @@ package springfox.documentation.grails; -import grails.core.GrailsDomainClass; +import org.grails.datastore.mapping.model.PersistentEntity; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import springfox.documentation.builders.AlternateTypeBuilder; import springfox.documentation.builders.AlternateTypePropertyBuilder; -import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -27,14 +26,14 @@ public GrailsSerializationTypeGenerator( this.naming = naming; } - public Class from(GrailsDomainClass domain) { + public Class from(PersistentEntity domain) { List properties = - Arrays.stream(domain.getProperties()) + domain.getPersistentProperties().stream() .filter(propertySelector) .map(propertyTransformer) .collect(Collectors.toList()); return new AlternateTypeBuilder() - .fullyQualifiedClassName(naming.name(domain.getClazz())) + .fullyQualifiedClassName(naming.name(domain.getJavaClass())) .withProperties(properties) .build(); } diff --git a/springfox-grails/src/main/java/springfox/documentation/grails/UrlMappings.java b/springfox-grails/src/main/java/springfox/documentation/grails/UrlMappings.java index 38da6e0..01e5e75 100644 --- a/springfox-grails/src/main/java/springfox/documentation/grails/UrlMappings.java +++ b/springfox-grails/src/main/java/springfox/documentation/grails/UrlMappings.java @@ -3,9 +3,10 @@ import com.fasterxml.classmate.ResolvedType; import com.fasterxml.classmate.TypeResolver; import com.google.common.base.Strings; -import grails.core.GrailsDomainClass; -import grails.validation.ConstrainedProperty; +import grails.gorm.validation.Constrained; +import grails.gorm.validation.ConstrainedProperty; import grails.web.mapping.UrlMapping; +import org.grails.datastore.mapping.model.PersistentEntity; import springfox.documentation.service.ResolvedMethodParameter; import java.util.Arrays; @@ -18,7 +19,7 @@ import java.util.stream.IntStream; import static com.google.common.collect.Lists.*; -import static springfox.documentation.grails.Parameters.pathParameter; +import static springfox.documentation.grails.Parameters.*; class UrlMappings { @@ -36,10 +37,12 @@ && controllerMatches(u, logicalControllerName) } public static Map pathParameters(UrlMapping mapping) { - ConstrainedProperty[] constraints = mapping.getConstraints(); + Constrained[] constraints = mapping.getConstraints(); return IntStream.range(0, constraints.length) .filter(indicesToUse(mapping)) .mapToObj(i -> constraints[i]) + .filter(c -> c instanceof ConstrainedProperty) + .map(ConstrainedProperty.class::cast) .collect(Collectors.toMap( ConstrainedProperty::getPropertyName, c -> String.format("{%s}", c.getPropertyName()))); @@ -48,11 +51,13 @@ public static Map pathParameters(UrlMapping mapping) { public static List resolvedPathParameters( TypeResolver resolver, UrlMapping mapping, - GrailsDomainClass domainClass) { - ConstrainedProperty[] constraints = mapping.getConstraints(); + PersistentEntity domainClass) { + Constrained[] constraints = mapping.getConstraints(); List pathProperties = IntStream.range(0, constraints.length) .filter(indicesToUse(mapping)) .mapToObj(i -> constraints[i]) + .filter(c -> c instanceof ConstrainedProperty) + .map(ConstrainedProperty.class::cast) .collect(Collectors.toList()); List resolved = newArrayList(); for (int index = 0; index < pathProperties.size(); index++) { @@ -68,18 +73,19 @@ public static List resolvedPathParameters( private static IntPredicate indicesToUse(UrlMapping mapping) { return index -> { - ConstrainedProperty property = mapping.getConstraints()[index]; - return !property.getPropertyName().equals("controller") - && !property.getPropertyName().equals("action") + Constrained property = mapping.getConstraints()[index]; + return property instanceof ConstrainedProperty + && !((ConstrainedProperty)property).getPropertyName().equals("controller") + && !((ConstrainedProperty)property).getPropertyName().equals("action") && !property.isNullable(); }; } private static ResolvedType resolvedPropertyType( TypeResolver resolver, - GrailsDomainClass domainClass, + PersistentEntity domainClass, ConstrainedProperty property) { - if (domainClass.hasProperty(property.getPropertyName())) { + if (domainClass.hasProperty(property.getPropertyName(), domainClass.getJavaClass())) { return resolver.resolve(domainClass.getPropertyByName(property.getPropertyName()).getType()); } return resolver.resolve(String.class); @@ -121,6 +127,8 @@ private static boolean isWildcardAction(UrlMapping urlMapping) { private static boolean hasControllerConstraint(UrlMapping urlMapping, String name) { return !Arrays.stream(urlMapping.getConstraints()) + .filter(c -> c instanceof ConstrainedProperty) + .map(ConstrainedProperty.class::cast) .filter(c -> c.getPropertyName().equals(name)) .collect(Collectors.toList()).isEmpty(); } diff --git a/springfox-grails/src/test/groovy/springfox/documentation/grails/ActionSpecificationFactorySpec.groovy b/springfox-grails/src/test/groovy/springfox/documentation/grails/ActionSpecificationFactorySpec.groovy index 8d5b240..8ff4de0 100644 --- a/springfox-grails/src/test/groovy/springfox/documentation/grails/ActionSpecificationFactorySpec.groovy +++ b/springfox-grails/src/test/groovy/springfox/documentation/grails/ActionSpecificationFactorySpec.groovy @@ -1,8 +1,9 @@ package springfox.documentation.grails import grails.core.GrailsControllerClass -import grails.core.GrailsDomainClass import grails.core.GrailsDomainClassProperty +import org.grails.datastore.mapping.model.PersistentEntity +import org.grails.datastore.mapping.model.PersistentProperty import org.grails.web.mapping.DefaultLinkGenerator import org.grails.web.mapping.DefaultUrlMappingsHolder import spock.lang.Specification @@ -43,19 +44,19 @@ class ActionSpecificationFactorySpec extends Specification implements UrlMapping } def mockDomain() { - def domain = Mock(GrailsDomainClass) - domain.clazz >> ADomain + def domain = Mock(PersistentEntity) + domain.javaClass >> ADomain domain.hasProperty("id") >> true def id = idProperty() domain.getPropertyByName("id") >> id domain.getPropertyByName(_) >> {args -> property(args[0])} domain.hasProperty(_) >> {args -> "format" != args[0]} - domain.identifier >> id + domain.identity >> id domain } GrailsDomainClassProperty property(name) { - def property = Mock(GrailsDomainClassProperty) + def property = Mock(PersistentProperty) property.type >> String property.name >> name property diff --git a/springfox-grails/src/test/groovy/springfox/documentation/grails/ActionsSpec.groovy b/springfox-grails/src/test/groovy/springfox/documentation/grails/ActionsSpec.groovy index 50ab2bb..81a2a31 100644 --- a/springfox-grails/src/test/groovy/springfox/documentation/grails/ActionsSpec.groovy +++ b/springfox-grails/src/test/groovy/springfox/documentation/grails/ActionsSpec.groovy @@ -2,7 +2,7 @@ package springfox.documentation.grails import com.fasterxml.classmate.TypeResolver import grails.core.GrailsControllerClass -import grails.core.GrailsDomainClass +import org.grails.datastore.mapping.model.PersistentEntity import org.springframework.http.MediaType import org.springframework.web.bind.annotation.RequestMethod import spock.lang.Unroll @@ -87,7 +87,7 @@ class ActionsSpec extends ActionSpecificationFactorySpec implements GrailsContro GrailsActionContext context(controller, action) { new GrailsActionContext( controller, - Mock(GrailsDomainClass), + Mock(PersistentEntity), actionAttributes, action, new TypeResolver()) diff --git a/springfox-grails/src/test/groovy/springfox/documentation/grails/DefaultGrailsAlternateTypeRuleConventionSpec.groovy b/springfox-grails/src/test/groovy/springfox/documentation/grails/DefaultGrailsAlternateTypeRuleConventionSpec.groovy index b15a9d7..75659b4 100644 --- a/springfox-grails/src/test/groovy/springfox/documentation/grails/DefaultGrailsAlternateTypeRuleConventionSpec.groovy +++ b/springfox-grails/src/test/groovy/springfox/documentation/grails/DefaultGrailsAlternateTypeRuleConventionSpec.groovy @@ -2,11 +2,11 @@ package springfox.documentation.grails import com.fasterxml.classmate.TypeResolver import grails.core.GrailsApplication -import grails.core.GrailsDomainClass -import grails.core.GrailsDomainClassProperty +import org.grails.datastore.mapping.model.MappingContext +import org.grails.datastore.mapping.model.PersistentEntity +import org.grails.datastore.mapping.model.PersistentProperty import spock.lang.Specification - class DefaultGrailsAlternateTypeRuleConventionSpec extends Specification { def "Alternate types for grails classes are created" () { given: @@ -35,22 +35,30 @@ class DefaultGrailsAlternateTypeRuleConventionSpec extends Specification { def grailsApplication() { def app = Mock(GrailsApplication) - app.getArtefacts("Domain") >> [petDomain()] + app.mappingContext >> mappingContext() app } + MappingContext mappingContext() { + def mappingContext = Mock(MappingContext) + mappingContext.persistentEntities >> [petDomain()] + mappingContext + } + def petDomain() { - def domain = Mock(GrailsDomainClass) + def domain = Mock(PersistentEntity) domain.name >> "Pet" - domain.clazz >> Pet - domain.properties >> [property("name", String)] + domain.javaClass >> Pet + domain.persistentProperties >> [property("name", String, domain)] + domain.associations >> [] domain } - def property(name, type) { - def property = Mock(GrailsDomainClassProperty) + def property(name, type, domain) { + def property = Mock(PersistentProperty) property.name >> name - property.referencedPropertyType >> type + property.owner >> domain + property.type >> type property } } diff --git a/springfox-grails/src/test/groovy/springfox/documentation/grails/DefaultGrailsPropertySelectorSpec.groovy b/springfox-grails/src/test/groovy/springfox/documentation/grails/DefaultGrailsPropertySelectorSpec.groovy index a53f091..4c02b8e 100644 --- a/springfox-grails/src/test/groovy/springfox/documentation/grails/DefaultGrailsPropertySelectorSpec.groovy +++ b/springfox-grails/src/test/groovy/springfox/documentation/grails/DefaultGrailsPropertySelectorSpec.groovy @@ -1,11 +1,11 @@ package springfox.documentation.grails -import grails.core.GrailsDomainClass -import grails.core.GrailsDomainClassProperty +import org.grails.datastore.mapping.model.PersistentEntity +import org.grails.datastore.mapping.model.PersistentProperty +import org.grails.datastore.mapping.model.types.Association import spock.lang.Specification import spock.lang.Unroll - class DefaultGrailsPropertySelectorSpec extends Specification { @Unroll def "selects scalar properties except version" () { @@ -21,26 +21,53 @@ class DefaultGrailsPropertySelectorSpec extends Specification { versionEntity() | false } - GrailsDomainClassProperty version() { - property("version", null) + PersistentProperty version() { + property("version", String, petDomain(false)) } - GrailsDomainClassProperty scalar() { - property("name", null) + PersistentProperty scalar() { + property("name", String, petDomain(false)) } - GrailsDomainClassProperty entity() { - property("name", Mock(GrailsDomainClass)) + PersistentProperty entity() { + property("siblingId", Pet, petDomain(true)) } - GrailsDomainClassProperty versionEntity() { - property("version", Mock(GrailsDomainClass)) + PersistentProperty versionEntity() { + property("version", Pet, petDomain(true)) } - def property(name, domain) { - def property = Mock(GrailsDomainClassProperty) + def property(name, type, domain) { + def property = Mock(PersistentProperty) property.name >> name - property.referencedDomainClass >> domain + property.owner >> domain + property.type >> type property } + + def petDomain(boolean addAssociation) { + def domain = Mock(PersistentEntity) + domain.name >> "Pet" + domain.javaClass >> Pet + domain.persistentProperties >> [property("name", String, domain), property("siblingId", String, domain)] + if (addAssociation) { + domain.associations >> [association()] + } else { + domain.associations >> [] + } + domain + } + + def association() { + def association = Mock(Association) + association.inverseSide >> inverseAssociation() + association.name >> "siblingId" + association + } + + def inverseAssociation() { + def association = Mock(Association) + association.owner >> petDomain(false) + association + } } diff --git a/springfox-grails/src/test/groovy/springfox/documentation/grails/DefaultGrailsPropertyTransformerSpec.groovy b/springfox-grails/src/test/groovy/springfox/documentation/grails/DefaultGrailsPropertyTransformerSpec.groovy index ada1d64..ef5d96f 100644 --- a/springfox-grails/src/test/groovy/springfox/documentation/grails/DefaultGrailsPropertyTransformerSpec.groovy +++ b/springfox-grails/src/test/groovy/springfox/documentation/grails/DefaultGrailsPropertyTransformerSpec.groovy @@ -1,73 +1,92 @@ package springfox.documentation.grails -import grails.core.GrailsDomainClass -import grails.core.GrailsDomainClassProperty +import org.grails.datastore.mapping.model.PersistentEntity +import org.grails.datastore.mapping.model.PersistentProperty +import org.grails.datastore.mapping.model.types.Association import spock.lang.Specification import spock.lang.Unroll - class DefaultGrailsPropertyTransformerSpec extends Specification { @Unroll - def "Infers types correctly for grails property #name" (){ + def "Infers types correctly for grails property #name"() { given: - def sut = new DefaultGrailsPropertyTransformer() + def sut = new DefaultGrailsPropertyTransformer() + when: - def transformed = sut.apply(property) + def transformed = sut.apply(property) + then: - transformed.name == name - transformed.clazz == type + transformed.name == name + transformed.clazz == type + where: - property | name | type - id() | "id" | Long - relatedEntityProperty() | "relatedEntity" | RelatedEntity - relatedEntityIdProperty() | "relatedEntityId" | Long - scalarProperty("test", String) | "test" | String + property | name | type + id(domainClass()) | "id" | Long + relatedEntityProperty(domainClass()) | "relatedEntity" | RelatedEntity + relatedEntityIdProperty(domainClass()) | "relatedEntityId" | Long + scalarProperty("test", String, domainClass()) | "test" | String } - def id() { - scalarProperty("id", Long) + def id(owner) { + scalarProperty("id", Long, owner) } - def scalarProperty(propertyName, propertyType) { - def property = Mock(GrailsDomainClassProperty) - property.referencedPropertyType >> propertyType + def scalarProperty(propertyName, propertyType, owner) { + def property = Mock(PersistentProperty) property.type >> propertyType - property.persistent >> true property.name >> propertyName + property.owner >> owner + + if (propertyName == "Id") { + owner.identity >> property + } property } - def relatedEntityProperty() { - def property = Mock(GrailsDomainClassProperty) - property.referencedPropertyType >> RelatedEntity - property.persistent >> true + def relatedEntityProperty(owner) { + def property = Mock(PersistentProperty) property.name >> "relatedEntity" - property.domainClass >> relatedEntityDomain() + property.owner >> owner + property.type >> RelatedEntity property } - def relatedEntityIdProperty() { - def property = Mock(GrailsDomainClassProperty) - property.referencedPropertyType >> Long - property.persistent >> false + def relatedEntityIdProperty(owner) { + def property = Mock(PersistentProperty) + property.type >> Long property.name >> "relatedEntityId" - property.domainClass >> domainClass() + property.owner >> owner property } - GrailsDomainClass domainClass() { - def domain = Mock(GrailsDomainClass) - domain.getPropertyByName("relatedEntity") >> relatedEntityProperty() - domain.hasProperty(_) >> {args -> "format" != args[0]} + def domainClass() { + def domain = Mock(PersistentEntity) + domain.associations >> [association(domain)] domain } - GrailsDomainClass relatedEntityDomain() { - def domain = Mock(GrailsDomainClass) - domain.getIdentifier() >> id() + def relatedEntityDomain() { + def domain = Mock(PersistentEntity) + domain.identity >> id() domain } + def association(domain) { + def association = Mock(Association) + association.inverseSide >> inverseAssociation() + association.name >> "relatedEntityId" + association.owner >> domain + association.type >> Long + association + } + + def inverseAssociation() { + def association = Mock(Association) + association.owner >> relatedEntityDomain() + association.type >> RelatedEntity + association + } + class RelatedEntity { } } diff --git a/springfox-grails/src/test/groovy/springfox/documentation/grails/GrailsActionContextSpec.groovy b/springfox-grails/src/test/groovy/springfox/documentation/grails/GrailsActionContextSpec.groovy index 1b03269..48023a6 100644 --- a/springfox-grails/src/test/groovy/springfox/documentation/grails/GrailsActionContextSpec.groovy +++ b/springfox-grails/src/test/groovy/springfox/documentation/grails/GrailsActionContextSpec.groovy @@ -2,9 +2,9 @@ package springfox.documentation.grails import com.fasterxml.classmate.TypeResolver import grails.core.GrailsControllerClass -import grails.core.GrailsDomainClass -import grails.core.GrailsDomainClassProperty import org.apache.commons.lang.StringUtils +import org.grails.datastore.mapping.model.PersistentEntity +import org.grails.datastore.mapping.model.PersistentProperty import org.grails.web.mapping.DefaultLinkGenerator import org.grails.web.mapping.DefaultUrlMappingsHolder import org.springframework.web.bind.annotation.RequestMethod @@ -82,14 +82,14 @@ class GrailsActionContextSpec extends Specification implements UrlMappingSupport links } - GrailsDomainClass domain() { - def mock = Mock(GrailsDomainClass) + PersistentEntity domain() { + def mock = Mock(PersistentEntity) mock.getPropertyByName(_) >> { args -> property(args[0]) } mock } def property(name) { - def mock = Mock(GrailsDomainClassProperty) + def mock = Mock(PersistentProperty) mock.getType() >> String mock.name >> name mock