Skip to content

Commit

Permalink
Feature/query parameter required (#12)
Browse files Browse the repository at this point in the history
* add support for required=false in query parameter for spring boot generator

* add clarifying TODOs for missing functionality
  • Loading branch information
mnembrini authored and saw303 committed Jul 12, 2018
1 parent 55a041c commit 4a5edbe
Show file tree
Hide file tree
Showing 7 changed files with 307 additions and 275 deletions.
Expand Up @@ -35,6 +35,7 @@
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

import static ch.silviowangler.gradle.restapi.PluginTypes.*;
Expand Down Expand Up @@ -67,10 +68,12 @@ protected void setCurrentVerb(Verb currentVerb) {
this.currentVerb = currentVerb;
}

@Override
public String getCurrentPackageName() {
return currentPackageName;
}

@Override
public ArtifactType getArtifactType() {
return artifactType;
}
Expand Down Expand Up @@ -172,18 +175,18 @@ public void generateResourceMethods() {

MethodSpec.Builder methodBuilder;

Map<String, ClassName> params = new HashMap<>();
this.currentVerb = verb;

verb.getParameters().forEach(p -> params.put(p.getName(), GeneratorUtil.translateToJava(p.getType())));
Map<String, VerbParameter> params = verb.getParameters().stream().collect(Collectors.toMap(VerbParameter::getName, Function.identity()));
Map<String, ClassName> paramClasses = new HashMap<>();

for (Representation representation : verb.getRepresentations()) {

boolean directEntity = parser.isDirectEntity();

List<ParameterSpec> pathParams = getPathParams(parser, isAbstractOrInterfaceResource());

MethodContext context = new MethodContext(resourceMethodReturnType(verb, representation), params, representation, pathParams, directEntity);
MethodContext context = new MethodContext(resourceMethodReturnType(verb, representation), params, paramClasses, representation, pathParams, directEntity);

if (GenerateRestApiTask.GET_COLLECTION.equals(verb.getVerb())) {

Expand All @@ -204,14 +207,14 @@ public void generateResourceMethods() {

if (GenerateRestApiTask.POST.equals(verb.getVerb())) {

params.put("model", model);
paramClasses.put("model", model);

context.setMethodName("createEntity");
methodBuilder = createMethod(context);

} else if (GenerateRestApiTask.PUT.equals(verb.getVerb())) {

params.put("model", model);
paramClasses.put("model", model);
context.setMethodName("updateEntity");
methodBuilder = createMethod(context);

Expand Down
Expand Up @@ -24,6 +24,7 @@
package ch.silviowangler.gradle.restapi.builder

import ch.silviowangler.rest.contract.model.v1.Representation
import ch.silviowangler.rest.contract.model.v1.VerbParameter
import com.squareup.javapoet.ClassName
import com.squareup.javapoet.ParameterSpec
import com.squareup.javapoet.TypeName
Expand All @@ -35,7 +36,8 @@ class MethodContext {

String methodName
TypeName returnType
Map<String, ClassName> params = [:]
Map<String, VerbParameter> params = [:]
Map<String, ClassName> paramClasses = [:]
Representation representation
List<ParameterSpec> pathParams = []
boolean directEntity
Expand All @@ -46,11 +48,13 @@ class MethodContext {
this.representation = representation
}

MethodContext(TypeName returnType, Map<String, ClassName> params, Representation representation, List<ParameterSpec> pathParams, boolean directEntity) {
MethodContext(TypeName returnType, Map<String, VerbParameter> params, Map<String, ClassName> paramClasses, Representation representation, List<ParameterSpec> pathParams, boolean directEntity) {
this.returnType = returnType
this.params = params
this.representation = representation
this.pathParams = pathParams
this.directEntity = directEntity
this.paramClasses = paramClasses

}
}
Expand Up @@ -28,6 +28,7 @@
import ch.silviowangler.gradle.restapi.RestApiPlugin;
import ch.silviowangler.rest.contract.model.v1.Representation;
import ch.silviowangler.rest.contract.model.v1.Verb;
import ch.silviowangler.rest.contract.model.v1.VerbParameter;
import com.google.common.base.CaseFormat;
import com.squareup.javapoet.*;

Expand Down Expand Up @@ -207,9 +208,26 @@ default MethodSpec.Builder createMethod(MethodContext context) {

List<String> names = new ArrayList<>(context.getParams().size());

context.getParams().forEach((name, type) -> {
context.getParams().forEach((name, p) -> {

ParameterSpec.Builder builder = ParameterSpec.builder(type, name);
ParameterSpec.Builder builder = ParameterSpec.builder(GeneratorUtil.translateToJava(p.getType()), name);

final boolean isHandleMethod = methodNameCopy.startsWith("handle");
final boolean isResource = isResourceInterface || isAbstractResourceClass;

if (isResource && !isHandleMethod) {
builder.addAnnotation(getQueryParamAnnotation(p));
}

ParameterSpec parameter = builder.build();

methodBuilder.addParameter(parameter);
names.add(name);
});

context.getParamClasses().forEach((name, className) -> {

ParameterSpec.Builder builder = ParameterSpec.builder(className, name);

final boolean isHandleMethod = methodNameCopy.startsWith("handle");
final boolean isResource = isResourceInterface || isAbstractResourceClass;
Expand All @@ -220,8 +238,6 @@ default MethodSpec.Builder createMethod(MethodContext context) {
if (providesRequestBodyAnnotation()) {
builder.addAnnotation(buildRequestBodyAnnotation());
}
} else if (isResource && !isHandleMethod) {
builder.addAnnotation(getQueryParamAnnotation(name));
}

ParameterSpec parameter = builder.build();
Expand All @@ -230,7 +246,7 @@ default MethodSpec.Builder createMethod(MethodContext context) {
names.add(name);
});

if (!context.isDirectEntity() && methodName.matches("(handle){0,1}(get|update|delete|Get|Update|Delete)Entity.*")) {
if (!context.isDirectEntity() && methodName.matches("(handle){0,1}(get|update|delete|Get|Update|Delete)Entity.*")) {
ParameterSpec id = generateIdParam(generateIdParamAnnotation);
methodBuilder.addParameter(id);
names.add(id.name);
Expand Down Expand Up @@ -270,7 +286,7 @@ default boolean isDefaultMethodNotAllowed(String methodName) {
return methodName.endsWith("AutoAnswer") && ArtifactType.RESOURCE.equals(getArtifactType());
}

AnnotationSpec getQueryParamAnnotation(String paramName);
AnnotationSpec getQueryParamAnnotation(VerbParameter paramName);

Iterable<AnnotationSpec> getResourceMethodAnnotations(boolean applyId, Representation representation, String methodName);

Expand Down
Expand Up @@ -29,6 +29,7 @@ import ch.silviowangler.gradle.restapi.builder.AbstractResourceBuilder
import ch.silviowangler.gradle.restapi.builder.ArtifactType
import ch.silviowangler.rest.contract.model.v1.Representation
import ch.silviowangler.rest.contract.model.v1.Verb
import ch.silviowangler.rest.contract.model.v1.VerbParameter
import com.squareup.javapoet.*

import java.nio.charset.Charset
Expand Down Expand Up @@ -111,8 +112,9 @@ class JaxRsRootResourceFactory extends AbstractResourceBuilder {


@Override
AnnotationSpec getQueryParamAnnotation(String paramName) {
return createAnnotation(JAX_RS_QUERY_PARAM, ['value': paramName])
AnnotationSpec getQueryParamAnnotation(VerbParameter paramName) {
// TODO handle VerbParameter options like required
return createAnnotation(JAX_RS_QUERY_PARAM, ['value': paramName.getName()])
}

@Override
Expand Down

0 comments on commit 4a5edbe

Please sign in to comment.