diff --git a/src/main/java/com/phoenixnap/oss/ramlplugin/raml2code/data/ApiBodyMetadata.java b/src/main/java/com/phoenixnap/oss/ramlplugin/raml2code/data/ApiBodyMetadata.java index 4b1a9de8..6b1db785 100644 --- a/src/main/java/com/phoenixnap/oss/ramlplugin/raml2code/data/ApiBodyMetadata.java +++ b/src/main/java/com/phoenixnap/oss/ramlplugin/raml2code/data/ApiBodyMetadata.java @@ -32,18 +32,20 @@ public class ApiBodyMetadata { private String name; + private String fullName; private String schema; private TypeDeclaration type; private JCodeModel codeModel; private boolean array = false; - public ApiBodyMetadata(String name, TypeDeclaration type, boolean array, JCodeModel codeModel) { + public ApiBodyMetadata(String name, TypeDeclaration type, boolean array, JCodeModel codeModel, String fullName) { super(); this.schema = null; this.type = type; this.name = name; this.codeModel = codeModel; this.array = array; + this.fullName = fullName; // array detection. i think we can default this to false since we should // already be generating lists from the type. nope we need it within // rules for narrowing to List @@ -68,6 +70,7 @@ public ApiBodyMetadata(String name, String schema, JCodeModel codeModel) { super(); this.schema = schema; this.name = name; + this.fullName = name; this.codeModel = codeModel; boolean typeFound = false; @@ -156,4 +159,11 @@ public JCodeModel getCodeModel(String basePackage, String schemaLocation, Annota } } + /** + * @return the fullName + */ + public String getFullName() { + return fullName; + } + } diff --git a/src/main/java/com/phoenixnap/oss/ramlplugin/raml2code/helpers/RamlTypeHelper.java b/src/main/java/com/phoenixnap/oss/ramlplugin/raml2code/helpers/RamlTypeHelper.java index ce878f3d..2a19c2b3 100644 --- a/src/main/java/com/phoenixnap/oss/ramlplugin/raml2code/helpers/RamlTypeHelper.java +++ b/src/main/java/com/phoenixnap/oss/ramlplugin/raml2code/helpers/RamlTypeHelper.java @@ -35,6 +35,7 @@ import com.phoenixnap.oss.ramlplugin.raml2code.data.ApiBodyMetadata; import com.phoenixnap.oss.ramlplugin.raml2code.interpreters.RamlInterpretationResult; import com.phoenixnap.oss.ramlplugin.raml2code.interpreters.RamlInterpreterFactory; +import com.phoenixnap.oss.ramlplugin.raml2code.plugin.Config; import com.phoenixnap.oss.ramlplugin.raml2code.raml.RamlRoot; import com.sun.codemodel.JAnnotationUse; import com.sun.codemodel.JClass; @@ -118,13 +119,19 @@ public static ApiBodyMetadata mapTypeToPojo(JCodeModel pojoCodeModel, RamlRoot d } boolean array = false; + String pojoName = pojo.name(); + String fullName = pojo.fullName(); if (pojo.name().contains("List<") || pojo.name().contains("Set<")) { array = true; pojoName = pojo.getTypeParameters().get(0).name(); + fullName = pojoName; + } + if (fullName.startsWith(Config.getBasePackage() + ".model")) { + fullName = pojoName; } - return new ApiBodyMetadata(pojoName, type, array, pojoCodeModel); + return new ApiBodyMetadata(pojoName, type, array, pojoCodeModel, fullName); } /** diff --git a/src/main/java/com/phoenixnap/oss/ramlplugin/raml2code/rules/spring/SpringCallableResponseEntityRule.java b/src/main/java/com/phoenixnap/oss/ramlplugin/raml2code/rules/spring/SpringCallableResponseEntityRule.java index 52d539be..67b76895 100644 --- a/src/main/java/com/phoenixnap/oss/ramlplugin/raml2code/rules/spring/SpringCallableResponseEntityRule.java +++ b/src/main/java/com/phoenixnap/oss/ramlplugin/raml2code/rules/spring/SpringCallableResponseEntityRule.java @@ -52,7 +52,7 @@ public JType apply(ApiActionMetadata endpointMetadata, JDefinedClass generatable JClass responseEntity = generatableType.owner().ref(ResponseEntity.class); if (!endpointMetadata.getResponseBody().isEmpty()) { ApiBodyMetadata apiBodyMetadata = endpointMetadata.getResponseBody().values().iterator().next(); - JClass genericType = findFirstClassBySimpleName(apiBodyMetadata.getCodeModel(), apiBodyMetadata.getName()); + JClass genericType = findFirstClassBySimpleName(apiBodyMetadata.getCodeModel(), apiBodyMetadata.getFullName()); if (apiBodyMetadata.isArray()) { JClass arrayType = generatableType.owner().ref(List.class); return callable.narrow(responseEntity.narrow(arrayType.narrow(genericType))); diff --git a/src/main/java/com/phoenixnap/oss/ramlplugin/raml2code/rules/spring/SpringFeignClientResponseTypeRule.java b/src/main/java/com/phoenixnap/oss/ramlplugin/raml2code/rules/spring/SpringFeignClientResponseTypeRule.java index 1a79d116..90d825ad 100644 --- a/src/main/java/com/phoenixnap/oss/ramlplugin/raml2code/rules/spring/SpringFeignClientResponseTypeRule.java +++ b/src/main/java/com/phoenixnap/oss/ramlplugin/raml2code/rules/spring/SpringFeignClientResponseTypeRule.java @@ -40,7 +40,7 @@ public JType apply(ApiActionMetadata endpointMetadata, JDefinedClass generatable JClass responseEntity = generatableType.owner().ref(ResponseEntity.class); if (!endpointMetadata.getResponseBody().isEmpty()) { ApiBodyMetadata apiBodyMetadata = endpointMetadata.getResponseBody().values().iterator().next(); - JClass genericType = findFirstClassBySimpleName(apiBodyMetadata.getCodeModel(), apiBodyMetadata.getName()); + JClass genericType = findFirstClassBySimpleName(apiBodyMetadata.getCodeModel(), apiBodyMetadata.getFullName()); if (apiBodyMetadata.isArray()) { JClass arrayType = generatableType.owner().ref(List.class); responseEntity = responseEntity.narrow(arrayType.narrow(genericType)); diff --git a/src/main/java/com/phoenixnap/oss/ramlplugin/raml2code/rules/spring/SpringObjectReturnTypeRule.java b/src/main/java/com/phoenixnap/oss/ramlplugin/raml2code/rules/spring/SpringObjectReturnTypeRule.java index 728ecbab..a3bbd85d 100644 --- a/src/main/java/com/phoenixnap/oss/ramlplugin/raml2code/rules/spring/SpringObjectReturnTypeRule.java +++ b/src/main/java/com/phoenixnap/oss/ramlplugin/raml2code/rules/spring/SpringObjectReturnTypeRule.java @@ -12,6 +12,10 @@ */ package com.phoenixnap.oss.ramlplugin.raml2code.rules.spring; +import static com.phoenixnap.oss.ramlplugin.raml2code.helpers.CodeModelHelper.findFirstClassBySimpleName; + +import java.util.List; + import com.phoenixnap.oss.ramlplugin.raml2code.data.ApiActionMetadata; import com.phoenixnap.oss.ramlplugin.raml2code.data.ApiBodyMetadata; import com.phoenixnap.oss.ramlplugin.raml2code.rules.Rule; @@ -19,10 +23,6 @@ import com.sun.codemodel.JDefinedClass; import com.sun.codemodel.JType; -import static com.phoenixnap.oss.ramlplugin.raml2code.helpers.CodeModelHelper.findFirstClassBySimpleName; - -import java.util.List; - /** * Creates an Object as a return type for an endpoint. If the endpoint declares * a response body the first type of the response body will used as return type @@ -46,7 +46,7 @@ public class SpringObjectReturnTypeRule implements Rule rule; + + @Test + public void validate_basic_interface_rule() throws Exception { + ((TestPojoConfig) Config.getPojoConfig()).setUseBigDecimals(true); + loadRaml("issue-275.raml"); + rule = new Spring4ControllerInterfaceRule(); + rule.apply(getControllerMetadata(), jCodeModel); + verifyGeneratedCode("Issue275-1Spring4ControllerInterface"); + ((TestPojoConfig) Config.getPojoConfig()).setUseBigDecimals(false); + } + + @Test + public void validate_callable_interface_rule() throws Exception { + ((TestPojoConfig) Config.getPojoConfig()).setUseBigDecimals(true); + loadRaml("issue-275.raml"); + rule = new Spring4ControllerInterfaceRule(); + + Map configuration = new HashMap<>(); + configuration.put(CALLABLE_RESPONSE_CONFIGURATION, "true"); + rule.applyConfiguration(configuration); + + rule.apply(getControllerMetadata(), jCodeModel); + verifyGeneratedCode("Issue275-2Spring4ControllerInterface"); + ((TestPojoConfig) Config.getPojoConfig()).setUseBigDecimals(false); + } + + @Test + public void validate_simple_return_type_interface_rule() throws Exception { + ((TestPojoConfig) Config.getPojoConfig()).setUseBigDecimals(true); + loadRaml("issue-275.raml"); + rule = new Spring4ControllerInterfaceRule(); + + Map configuration = new HashMap<>(); + configuration.put(SIMPLE_RETURN_TYPES, "true"); + rule.applyConfiguration(configuration); + + rule.apply(getControllerMetadata(), jCodeModel); + verifyGeneratedCode("Issue275-3Spring4ControllerInterface"); + } + + @Test + public void validate_basic_decorator_rule() throws Exception { + ((TestPojoConfig) Config.getPojoConfig()).setUseBigDecimals(true); + loadRaml("issue-275.raml"); + rule = new Spring4ControllerDecoratorRule(); + rule.apply(getControllerMetadata(), jCodeModel); + verifyGeneratedCode("Issue275-1Spring4ControllerDecorator"); + ((TestPojoConfig) Config.getPojoConfig()).setUseBigDecimals(false); + } + + @Test + public void validate_callable_decorator_rule() throws Exception { + ((TestPojoConfig) Config.getPojoConfig()).setUseBigDecimals(true); + loadRaml("issue-275.raml"); + rule = new Spring4ControllerDecoratorRule(); + + Map configuration = new HashMap<>(); + configuration.put(CALLABLE_RESPONSE_CONFIGURATION, "true"); + rule.applyConfiguration(configuration); + + rule.apply(getControllerMetadata(), jCodeModel); + verifyGeneratedCode("Issue275-2Spring4ControllerDecorator"); + ((TestPojoConfig) Config.getPojoConfig()).setUseBigDecimals(false); + } + + @Test + public void validate_simple_return_type_decorator_rule() throws Exception { + ((TestPojoConfig) Config.getPojoConfig()).setUseBigDecimals(true); + loadRaml("issue-275.raml"); + rule = new Spring4ControllerDecoratorRule(); + + Map configuration = new HashMap<>(); + configuration.put(SIMPLE_RETURN_TYPES, "true"); + rule.applyConfiguration(configuration); + + rule.apply(getControllerMetadata(), jCodeModel); + verifyGeneratedCode("Issue275-3Spring4ControllerDecorator"); + } + + @Test + public void validate_basic_client_rule() throws Exception { + ((TestPojoConfig) Config.getPojoConfig()).setUseBigDecimals(true); + loadRaml("issue-275.raml"); + rule = new Spring4RestTemplateClientRule(); + rule.apply(getControllerMetadata(), jCodeModel); + verifyGeneratedCode("Issue275-Spring4RestTemplateClient"); + ((TestPojoConfig) Config.getPojoConfig()).setUseBigDecimals(false); + } + +} diff --git a/src/test/resources/ramls/github/issue-275.raml b/src/test/resources/ramls/github/issue-275.raml new file mode 100644 index 00000000..1bb085d0 --- /dev/null +++ b/src/test/resources/ramls/github/issue-275.raml @@ -0,0 +1,14 @@ +#%RAML 1.0 +title: Number as bigdecimal +version: 1.0 + +/number: + get: + description: Returns the winning number. + queryParameters: + name: string + responses: + 200: + body: + application/json: + type: number \ No newline at end of file diff --git a/src/test/resources/validations/github/Issue275-1Spring4ControllerDecorator.java.txt b/src/test/resources/validations/github/Issue275-1Spring4ControllerDecorator.java.txt new file mode 100644 index 00000000..e4c47b39 --- /dev/null +++ b/src/test/resources/validations/github/Issue275-1Spring4ControllerDecorator.java.txt @@ -0,0 +1,64 @@ +-----------------------------------com.gen.test.NumberController.java----------------------------------- + +package com.gen.test; + +import java.math.BigDecimal; +import org.springframework.http.ResponseEntity; + + +/** + * No description + * (Generated with springmvc-raml-parser v.@project.version@) + * + */ +public interface NumberController { + + + /** + * Returns the winning number. + * + */ + public ResponseEntity getBigDecimalByName(String name); + +} +-----------------------------------com.gen.test.NumberControllerDecorator.java----------------------------------- + +package com.gen.test; + +import java.math.BigDecimal; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + + +/** + * No description + * (Generated with springmvc-raml-parser v.@project.version@) + * + */ +@RestController +@RequestMapping("/api/number") +@Validated +public class NumberControllerDecorator + implements NumberController +{ + + @Autowired + private NumberController numberControllerDelegate; + + /** + * Returns the winning number. + * + */ + @RequestMapping(value = "", method = RequestMethod.GET) + public ResponseEntity getBigDecimalByName( + @RequestParam + String name) { + return this.numberControllerDelegate.getBigDecimalByName(name); + } + +} diff --git a/src/test/resources/validations/github/Issue275-1Spring4ControllerInterface.java.txt b/src/test/resources/validations/github/Issue275-1Spring4ControllerInterface.java.txt new file mode 100644 index 00000000..029b2429 --- /dev/null +++ b/src/test/resources/validations/github/Issue275-1Spring4ControllerInterface.java.txt @@ -0,0 +1,34 @@ +-----------------------------------com.gen.test.NumberController.java----------------------------------- + +package com.gen.test; + +import java.math.BigDecimal; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + + +/** + * No description + * (Generated with springmvc-raml-parser v.@project.version@) + * + */ +@RestController +@Validated +@RequestMapping("/api/number") +public interface NumberController { + + + /** + * Returns the winning number. + * + */ + @RequestMapping(value = "", method = RequestMethod.GET) + public ResponseEntity getBigDecimalByName( + @RequestParam + String name); + +} diff --git a/src/test/resources/validations/github/Issue275-2Spring4ControllerDecorator.java.txt b/src/test/resources/validations/github/Issue275-2Spring4ControllerDecorator.java.txt new file mode 100644 index 00000000..6df7dc84 --- /dev/null +++ b/src/test/resources/validations/github/Issue275-2Spring4ControllerDecorator.java.txt @@ -0,0 +1,66 @@ +-----------------------------------com.gen.test.NumberController.java----------------------------------- + +package com.gen.test; + +import java.math.BigDecimal; +import java.util.concurrent.Callable; +import org.springframework.http.ResponseEntity; + + +/** + * No description + * (Generated with springmvc-raml-parser v.@project.version@) + * + */ +public interface NumberController { + + + /** + * Returns the winning number. + * + */ + public Callable> getBigDecimalByName(String name); + +} +-----------------------------------com.gen.test.NumberControllerDecorator.java----------------------------------- + +package com.gen.test; + +import java.math.BigDecimal; +import java.util.concurrent.Callable; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + + +/** + * No description + * (Generated with springmvc-raml-parser v.@project.version@) + * + */ +@RestController +@RequestMapping("/api/number") +@Validated +public class NumberControllerDecorator + implements NumberController +{ + + @Autowired + private NumberController numberControllerDelegate; + + /** + * Returns the winning number. + * + */ + @RequestMapping(value = "", method = RequestMethod.GET) + public Callable> getBigDecimalByName( + @RequestParam + String name) { + return this.numberControllerDelegate.getBigDecimalByName(name); + } + +} diff --git a/src/test/resources/validations/github/Issue275-2Spring4ControllerInterface.java.txt b/src/test/resources/validations/github/Issue275-2Spring4ControllerInterface.java.txt new file mode 100644 index 00000000..55d22235 --- /dev/null +++ b/src/test/resources/validations/github/Issue275-2Spring4ControllerInterface.java.txt @@ -0,0 +1,35 @@ +-----------------------------------com.gen.test.NumberController.java----------------------------------- + +package com.gen.test; + +import java.math.BigDecimal; +import java.util.concurrent.Callable; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + + +/** + * No description + * (Generated with springmvc-raml-parser v.@project.version@) + * + */ +@RestController +@Validated +@RequestMapping("/api/number") +public interface NumberController { + + + /** + * Returns the winning number. + * + */ + @RequestMapping(value = "", method = RequestMethod.GET) + public Callable> getBigDecimalByName( + @RequestParam + String name); + +} diff --git a/src/test/resources/validations/github/Issue275-3Spring4ControllerDecorator.java.txt b/src/test/resources/validations/github/Issue275-3Spring4ControllerDecorator.java.txt new file mode 100644 index 00000000..e4c47b39 --- /dev/null +++ b/src/test/resources/validations/github/Issue275-3Spring4ControllerDecorator.java.txt @@ -0,0 +1,64 @@ +-----------------------------------com.gen.test.NumberController.java----------------------------------- + +package com.gen.test; + +import java.math.BigDecimal; +import org.springframework.http.ResponseEntity; + + +/** + * No description + * (Generated with springmvc-raml-parser v.@project.version@) + * + */ +public interface NumberController { + + + /** + * Returns the winning number. + * + */ + public ResponseEntity getBigDecimalByName(String name); + +} +-----------------------------------com.gen.test.NumberControllerDecorator.java----------------------------------- + +package com.gen.test; + +import java.math.BigDecimal; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + + +/** + * No description + * (Generated with springmvc-raml-parser v.@project.version@) + * + */ +@RestController +@RequestMapping("/api/number") +@Validated +public class NumberControllerDecorator + implements NumberController +{ + + @Autowired + private NumberController numberControllerDelegate; + + /** + * Returns the winning number. + * + */ + @RequestMapping(value = "", method = RequestMethod.GET) + public ResponseEntity getBigDecimalByName( + @RequestParam + String name) { + return this.numberControllerDelegate.getBigDecimalByName(name); + } + +} diff --git a/src/test/resources/validations/github/Issue275-3Spring4ControllerInterface.java.txt b/src/test/resources/validations/github/Issue275-3Spring4ControllerInterface.java.txt new file mode 100644 index 00000000..c0cfe290 --- /dev/null +++ b/src/test/resources/validations/github/Issue275-3Spring4ControllerInterface.java.txt @@ -0,0 +1,33 @@ +-----------------------------------com.gen.test.NumberController.java----------------------------------- + +package com.gen.test; + +import java.math.BigDecimal; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + + +/** + * No description + * (Generated with springmvc-raml-parser v.@project.version@) + * + */ +@RestController +@Validated +@RequestMapping("/api/number") +public interface NumberController { + + + /** + * Returns the winning number. + * + */ + @RequestMapping(value = "", method = RequestMethod.GET) + public BigDecimal getBigDecimalByName( + @RequestParam + String name); + +} diff --git a/src/test/resources/validations/github/Issue275-Spring4RestTemplateClient.java.txt b/src/test/resources/validations/github/Issue275-Spring4RestTemplateClient.java.txt new file mode 100644 index 00000000..a680fc90 --- /dev/null +++ b/src/test/resources/validations/github/Issue275-Spring4RestTemplateClient.java.txt @@ -0,0 +1,79 @@ +-----------------------------------com.gen.test.NumberClient.java----------------------------------- + +package com.gen.test; + +import java.math.BigDecimal; +import org.springframework.http.ResponseEntity; + + +/** + * No description + * (Generated with springmvc-raml-parser v.@project.version@) + * + */ +public interface NumberClient { + + + /** + * Returns the winning number. + * + * @param name + */ + public ResponseEntity getBigDecimalByName(String name); + +} +-----------------------------------com.gen.test.NumberClientImpl.java----------------------------------- + +package com.gen.test; + +import java.math.BigDecimal; +import java.util.ArrayList; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; + + +/** + * No description + * (Generated with springmvc-raml-parser v.@project.version@) + * + */ +@Component +public class NumberClientImpl + implements NumberClient +{ + + @Value("${client.url}") + private String baseUrl; + @Autowired + private RestTemplate restTemplate; + + /** + * Returns the winning number. + * + */ + public ResponseEntity getBigDecimalByName(String name) { + HttpHeaders httpHeaders = new HttpHeaders(); + // Add Accepts Headers and Body Content-Type + ArrayList acceptsList = new ArrayList(); + acceptsList.add(MediaType.valueOf("application/json")); + httpHeaders.setAccept(acceptsList); + String url = baseUrl.concat("/number"); + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url); + if (name!= null) { + builder.queryParam("name", name); + } + UriComponents uriComponents = builder.build(); + HttpEntity httpEntity = new HttpEntity(httpHeaders); + return this.restTemplate.exchange(uriComponents.encode().toUri(), HttpMethod.GET, httpEntity, BigDecimal.class); + } + +}