Skip to content

Commit

Permalink
Fixes #275
Browse files Browse the repository at this point in the history
Import Statement for BigDecimal not generated
  • Loading branch information
Aleksandar Stojsavljevic committed Sep 11, 2018
1 parent 0d9cef5 commit 0d78b2f
Show file tree
Hide file tree
Showing 18 changed files with 537 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
Expand Down Expand Up @@ -156,4 +159,11 @@ public JCodeModel getCodeModel(String basePackage, String schemaLocation, Annota
}
}

/**
* @return the fullName
*/
public String getFullName() {
return fullName;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,17 @@
*/
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;
import com.sun.codemodel.JClass;
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
Expand All @@ -46,7 +46,7 @@ public class SpringObjectReturnTypeRule implements Rule<JDefinedClass, JType, Ap
public JType apply(ApiActionMetadata endpointMetadata, JDefinedClass generatableType) {
if (!endpointMetadata.getResponseBody().isEmpty()) {
ApiBodyMetadata apiBodyMetadata = endpointMetadata.getResponseBody().values().iterator().next();
JClass returnType = findFirstClassBySimpleName(apiBodyMetadata.getCodeModel(), apiBodyMetadata.getName());
JClass returnType = findFirstClassBySimpleName(apiBodyMetadata.getCodeModel(), apiBodyMetadata.getFullName());
if (apiBodyMetadata.isArray()) {
JClass arrayType = generatableType.owner().ref(List.class);
return arrayType.narrow(returnType);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,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 responseEntity.narrow(arrayType.narrow(genericType));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ public JMethod apply(ApiActionMetadata endpointMetadata, CodeModelHelper.JExtMet
JClass returnType = null;
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 = owner.ref(List.class);
returnType = arrayType.narrow(genericType);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public JType apply(ApiActionMetadata endpointMetadata, JDefinedClass generatable
JClass responseType = 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);
responseType = arrayType.narrow(genericType);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public JType apply(ApiActionMetadata endpointMetadata, JDefinedClass generatable
JClass responseType = 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 arrayType.narrow(genericType);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
package com.phoenixnap.oss.ramlplugin.raml2code.github;

import static com.phoenixnap.oss.ramlplugin.raml2code.rules.spring.SpringConfigurableRule.CALLABLE_RESPONSE_CONFIGURATION;
import static com.phoenixnap.oss.ramlplugin.raml2code.rules.spring.SpringConfigurableRule.SIMPLE_RETURN_TYPES;

import java.util.HashMap;
import java.util.Map;

import org.junit.Test;

import com.phoenixnap.oss.ramlplugin.raml2code.data.ApiResourceMetadata;
import com.phoenixnap.oss.ramlplugin.raml2code.plugin.Config;
import com.phoenixnap.oss.ramlplugin.raml2code.rules.ConfigurableRule;
import com.phoenixnap.oss.ramlplugin.raml2code.rules.GitHubAbstractRuleTestBase;
import com.phoenixnap.oss.ramlplugin.raml2code.rules.Spring4ControllerDecoratorRule;
import com.phoenixnap.oss.ramlplugin.raml2code.rules.Spring4ControllerInterfaceRule;
import com.phoenixnap.oss.ramlplugin.raml2code.rules.Spring4RestTemplateClientRule;
import com.phoenixnap.oss.ramlplugin.raml2code.rules.TestPojoConfig;
import com.sun.codemodel.JCodeModel;
import com.sun.codemodel.JDefinedClass;

/**
* @author aleksandars
* @since 2.0.4
*/
public class Issue275RulesTest extends GitHubAbstractRuleTestBase {

private ConfigurableRule<JCodeModel, JDefinedClass, ApiResourceMetadata> 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<String, String> 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<String, String> 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<String, String> 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<String, String> 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);
}

}
14 changes: 14 additions & 0 deletions src/test/resources/ramls/github/issue-275.raml
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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<BigDecimal> 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<BigDecimal> getBigDecimalByName(
@RequestParam
String name) {
return this.numberControllerDelegate.getBigDecimalByName(name);
}

}
Original file line number Diff line number Diff line change
@@ -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<BigDecimal> getBigDecimalByName(
@RequestParam
String name);

}
Loading

0 comments on commit 0d78b2f

Please sign in to comment.