diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/emitters/tasks/MarshallerGeneratorTasks.java b/codegen/src/main/java/software/amazon/awssdk/codegen/emitters/tasks/MarshallerGeneratorTasks.java index 2c7bd4127559..46896684c658 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/emitters/tasks/MarshallerGeneratorTasks.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/emitters/tasks/MarshallerGeneratorTasks.java @@ -30,19 +30,19 @@ import software.amazon.awssdk.codegen.model.intermediate.Metadata; import software.amazon.awssdk.codegen.model.intermediate.ShapeModel; import software.amazon.awssdk.codegen.model.intermediate.ShapeType; +import software.amazon.awssdk.codegen.poet.transform.JsonModelMarshallerSpec; +import software.amazon.awssdk.codegen.poet.transform.MarshallerSpec; import software.amazon.awssdk.core.util.ImmutableMapParameter; public class MarshallerGeneratorTasks extends BaseGeneratorTasks { private final String transformClassDir; - private final String requestTransformClassDir; private final Metadata metadata; private final Map shapes; public MarshallerGeneratorTasks(GeneratorTaskParams dependencies) { super(dependencies); this.transformClassDir = dependencies.getPathProvider().getTransformDirectory(); - this.requestTransformClassDir = dependencies.getPathProvider().getRequestTransformDirectory(); this.metadata = model.getMetadata(); this.shapes = model.getShapes(); } @@ -51,9 +51,9 @@ public MarshallerGeneratorTasks(GeneratorTaskParams dependencies) { protected List createTasks() throws Exception { info("Emitting marshaller classes"); return model.getShapes().entrySet().stream() - .filter(e -> shouldGenerate(e.getValue())) - .flatMap(safeFunction(e -> createTask(e.getKey(), e.getValue()))) - .collect(Collectors.toList()); + .filter(e -> shouldGenerate(e.getValue())) + .flatMap(safeFunction(e -> createTask(e.getKey(), e.getValue()))) + .collect(Collectors.toList()); } private boolean shouldGenerate(ShapeModel shapeModel) { @@ -69,39 +69,33 @@ private boolean shouldGenerate(ShapeType shapeType) { } private Stream createTask(String javaShapeName, ShapeModel shapeModel) throws Exception { - if (shapeModel.getShapeType() == ShapeType.Request && metadata.isJsonProtocol()) { - return Stream.of( - createMarshallerTask(javaShapeName, - freemarker.getRequestMarshallerTemplate(), - javaShapeName + "Marshaller", - requestTransformClassDir), - createMarshallerTask(javaShapeName, - freemarker.getModelMarshallerTemplate(), - javaShapeName + "ModelMarshaller", - transformClassDir)); - } else { - return Stream.of( - createMarshallerTask(javaShapeName, - freemarker.getModelMarshallerTemplate(), - javaShapeName + "Marshaller", - transformClassDir)); + if (metadata.isJsonProtocol()) { + return ShapeType.Request == shapeModel.getShapeType() ? + Stream.of(createPoetGeneratorTask(new JsonModelMarshallerSpec(model, shapeModel, "ModelMarshaller")), + createPoetGeneratorTask(new MarshallerSpec(model, shapeModel))) : + Stream.of(createPoetGeneratorTask(new JsonModelMarshallerSpec(model, shapeModel, "Marshaller"))); } + + return Stream.of( + createMarshallerTask(javaShapeName, + freemarker.getModelMarshallerTemplate(), + javaShapeName + "Marshaller", + transformClassDir)); } private GeneratorTask createMarshallerTask(String javaShapeName, Template template, - String marshallerClassName, String marshallerDirectory) - throws IOException { + String marshallerClassName, String marshallerDirectory) throws IOException { Map marshallerDataModel = ImmutableMapParameter.builder() - .put("fileHeader", model.getFileHeader()) - .put("shapeName", javaShapeName) - .put("shapes", shapes) - .put("metadata", metadata) - .put("transformPackage", model.getMetadata().getFullTransformPackageName()) - .put("requestTransformPackage", model.getMetadata().getFullRequestTransformPackageName()) - .put("customConfig", model.getCustomizationConfig()) - .put("className", marshallerClassName) - .put("protocolEnum", getProtocolEnumName()) - .build(); + .put("fileHeader", model.getFileHeader()) + .put("shapeName", javaShapeName) + .put("shapes", shapes) + .put("metadata", metadata) + .put("transformPackage", model.getMetadata().getFullTransformPackageName()) + .put("requestTransformPackage", model.getMetadata().getFullRequestTransformPackageName()) + .put("customConfig", model.getCustomizationConfig()) + .put("className", marshallerClassName) + .put("protocolEnum", getProtocolEnumName()) + .build(); return new FreemarkerGeneratorTask(marshallerDirectory, marshallerClassName, diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/internal/Freemarker.java b/codegen/src/main/java/software/amazon/awssdk/codegen/internal/Freemarker.java index 1c5c8d1e21c2..c1665d94699d 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/internal/Freemarker.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/internal/Freemarker.java @@ -99,22 +99,10 @@ private Template getTemplate(TopLevelTemplate template) throws IOException { return fmConfig.getTemplate(template.getMainTemplate()); } - public Template getSyncClientBuilderTemplate() throws IOException { - return getTemplate(templateConfig.getSyncClientBuilder()); - } - - public Template getAsyncClientBuilderTemplate() throws IOException { - return getTemplate(templateConfig.getAsyncClientBuilder()); - } - public Template getModelMarshallerTemplate() throws IOException { return getTemplate(templateConfig.getModelMarshaller()); } - public Template getRequestMarshallerTemplate() throws IOException { - return getTemplate(templateConfig.getRequestMarshaller()); - } - public Template getModelUnmarshallerTemplate() throws IOException { return getTemplate(templateConfig.getModelUnmarshaller()); } diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/model/config/customization/CustomizationConfig.java b/codegen/src/main/java/software/amazon/awssdk/codegen/model/config/customization/CustomizationConfig.java index 64c3cd3a38f8..49f5cc89237d 100644 --- a/codegen/src/main/java/software/amazon/awssdk/codegen/model/config/customization/CustomizationConfig.java +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/model/config/customization/CustomizationConfig.java @@ -121,6 +121,8 @@ public class CustomizationConfig { private String sdkResponseBaseClassName; private String defaultExceptionUnmarshaller; + private Map modelMarshallerDefaultValueSupplier; + private CustomizationConfig() { } @@ -312,4 +314,12 @@ public String getDefaultExceptionUnmarshaller() { public void setDefaultExceptionUnmarshaller(String defaultExceptionUnmarshaller) { this.defaultExceptionUnmarshaller = defaultExceptionUnmarshaller; } + + public Map getModelMarshallerDefaultValueSupplier() { + return modelMarshallerDefaultValueSupplier; + } + + public void setModelMarshallerDefaultValueSupplier(Map modelMarshallerDefaultValueSupplier) { + this.modelMarshallerDefaultValueSupplier = modelMarshallerDefaultValueSupplier; + } } diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/transform/JsonModelMarshallerSpec.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/transform/JsonModelMarshallerSpec.java new file mode 100644 index 000000000000..e74efaad5449 --- /dev/null +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/transform/JsonModelMarshallerSpec.java @@ -0,0 +1,197 @@ +/* + * Copyright 2010-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.codegen.poet.transform; + +import com.squareup.javapoet.ClassName; +import com.squareup.javapoet.CodeBlock; +import com.squareup.javapoet.FieldSpec; +import com.squareup.javapoet.MethodSpec; +import com.squareup.javapoet.ParameterizedTypeName; +import com.squareup.javapoet.TypeName; +import com.squareup.javapoet.TypeSpec; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import javax.lang.model.element.Modifier; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel; +import software.amazon.awssdk.codegen.model.intermediate.MemberModel; +import software.amazon.awssdk.codegen.model.intermediate.ShapeModel; +import software.amazon.awssdk.codegen.poet.ClassSpec; +import software.amazon.awssdk.codegen.poet.PoetExtensions; +import software.amazon.awssdk.codegen.poet.PoetUtils; +import software.amazon.awssdk.core.exception.SdkClientException; +import software.amazon.awssdk.core.protocol.MarshallLocation; +import software.amazon.awssdk.core.protocol.MarshallingInfo; +import software.amazon.awssdk.core.protocol.MarshallingType; +import software.amazon.awssdk.core.protocol.ProtocolMarshaller; +import software.amazon.awssdk.core.protocol.StructuredPojo; +import software.amazon.awssdk.core.util.IdempotentUtils; +import software.amazon.awssdk.utils.Validate; + +/** + * Create ModelMarshaller for Json protocol + */ +public class JsonModelMarshallerSpec implements ClassSpec { + + private final IntermediateModel intermediateModel; + private final ShapeModel shapeModel; + private final ClassName className; + private final ClassName requestClassName; + + public JsonModelMarshallerSpec(IntermediateModel intermediateModel, ShapeModel shapeModel, String className) { + PoetExtensions poetExtensions = new PoetExtensions(intermediateModel); + String modelPackage = intermediateModel.getMetadata().getFullModelPackageName(); + this.intermediateModel = intermediateModel; + this.shapeModel = shapeModel; + this.className = poetExtensions.getTransformClass(shapeModel.getShapeName() + className); + this.requestClassName = ClassName.get(modelPackage, shapeModel.getShapeName()); + } + + @Override + public TypeSpec poetSpec() { + return TypeSpec.classBuilder(className) + .addModifiers(Modifier.PUBLIC) + .addAnnotation(PoetUtils.GENERATED) + .addAnnotation(SdkInternalApi.class) + .addJavadoc("{@link $T} Marshaller", requestClassName) + .addFields(memberVariables()) + .addMethods(methods()) + .build(); + } + + @Override + public ClassName className() { + return className; + } + + private List methods() { + List methodSpecs = new ArrayList<>(); + + methodSpecs.add(constructor()); + methodSpecs.add(getInstanceMethod()); + methodSpecs.add(marshallMethod()); + return methodSpecs; + } + + private List memberVariables() { + List fields = new ArrayList<>(); + + FieldSpec instance = FieldSpec.builder(className, "INSTANCE") + .addModifiers(Modifier.PRIVATE, Modifier.FINAL, Modifier.STATIC) + .initializer("new $T()", className) + .build(); + + for (MemberModel memberModel : shapeModel.getNonStreamingMembers()) { + TypeName typeName = ParameterizedTypeName.get(ClassName.get(MarshallingInfo.class), + marshallingTargetClass(memberModel.getMarshallingTargetClass(), + memberModel.getVariable().getVariableType())); + + CodeBlock.Builder initializationCodeBlockBuilder = CodeBlock.builder() + .add("$T.builder($T.$L).marshallLocation($T.$L)", + MarshallingInfo.class, + MarshallingType.class, + memberModel.getMarshallingType(), + ClassName.get(MarshallLocation.class), + memberModel.getHttp().getMarshallLocation()); + + if (memberModel.getHttp().getIsPayload()) { + initializationCodeBlockBuilder.add(".isExplicitPayloadMember($L)", memberModel.getHttp().getIsPayload()); + } else { + initializationCodeBlockBuilder.add(".marshallLocationName($S)", memberModel.getHttp().getMarshallLocationName()); + } + + initializationCodeBlockBuilder.add(".isBinary($L)", memberModel.getIsBinary()); + + Optional.ofNullable(intermediateModel.getCustomizationConfig().getModelMarshallerDefaultValueSupplier()) + .map(defaultValueSupplier -> defaultValueSupplier.get(memberModel.getName())) + .ifPresent(value -> initializationCodeBlockBuilder.add(".defaultValueSupplier($L)", value)); + + if (memberModel.isIdempotencyToken()) { + initializationCodeBlockBuilder.add(".defaultValueSupplier($T.getGenerator())", ClassName.get(IdempotentUtils + .class)); + } + + CodeBlock codeBlock = initializationCodeBlockBuilder.add(".build()").build(); + + FieldSpec fieldSpec = FieldSpec.builder(typeName, memberModel.getMarshallerBindingFieldName()) + .addModifiers(Modifier.PRIVATE, Modifier.FINAL, Modifier.STATIC) + .initializer(codeBlock) + .build(); + fields.add(fieldSpec); + } + + fields.add(instance); + return fields; + } + + private MethodSpec constructor() { + return MethodSpec.constructorBuilder().addModifiers(Modifier.PRIVATE).build(); + } + + private MethodSpec getInstanceMethod() { + return MethodSpec.methodBuilder("getInstance").addModifiers(Modifier.STATIC, Modifier.PUBLIC) + .addStatement("return INSTANCE") + .returns(className) + .build(); + } + + private MethodSpec marshallMethod() { + String variableName = shapeModel.getVariable().getVariableName(); + MethodSpec.Builder methodSpecBuilder = MethodSpec.methodBuilder("marshall") + .addJavadoc("Marshall the given parameter object") + .addModifiers(Modifier.PUBLIC) + .addParameter(requestClassName, variableName) + .addParameter(ProtocolMarshaller.class, "protocolMarshaller"); + + if (shapeModel.getNonStreamingMembers().isEmpty()) { + return methodSpecBuilder.build(); + } + + methodSpecBuilder.addStatement("$T.paramNotNull($L, $S)", ClassName.get(Validate.class), variableName, variableName); + methodSpecBuilder.addStatement("$T.paramNotNull($L, $S)", ClassName.get(Validate.class), "protocolMarshaller", + "protocolMarshaller"); + + methodSpecBuilder.beginControlFlow("try"); + shapeModel.getNonStreamingMembers().forEach( + memberModel -> methodSpecBuilder.addStatement("protocolMarshaller.marshall($L.$L(), $L)", + variableName, + memberModel.getFluentGetterMethodName(), + memberModel.getMarshallerBindingFieldName())); + + methodSpecBuilder.endControlFlow(); + methodSpecBuilder.beginControlFlow("catch (Exception e)"); + methodSpecBuilder.addStatement("throw new $T(\"Unable to marshall request to JSON: \" + e.getMessage(), e)", ClassName + .get(SdkClientException.class)); + methodSpecBuilder.endControlFlow(); + return methodSpecBuilder.build(); + } + + private ClassName marshallingTargetClass(String marshallerTargetClass, String variableType) { + if ("List".equals(marshallerTargetClass)) { + return ClassName.get(List.class); + } else if ("String".equals(marshallerTargetClass)) { + return ClassName.get(String.class); + } else if ("Map".equals(marshallerTargetClass)) { + return ClassName.get(Map.class); + } else if ("StructuredPojo".equals(marshallerTargetClass)) { + return ClassName.get(StructuredPojo.class); + } else { + return ClassName.bestGuess(variableType); + } + } +} diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/transform/MarshallerSpec.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/transform/MarshallerSpec.java new file mode 100644 index 000000000000..4d5c004c5f34 --- /dev/null +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/transform/MarshallerSpec.java @@ -0,0 +1,131 @@ +/* + * Copyright 2010-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.codegen.poet.transform; + +import com.squareup.javapoet.ClassName; +import com.squareup.javapoet.MethodSpec; +import com.squareup.javapoet.ParameterizedTypeName; +import com.squareup.javapoet.TypeName; +import com.squareup.javapoet.TypeSpec; +import java.util.ArrayList; +import java.util.List; +import javax.lang.model.element.Modifier; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel; +import software.amazon.awssdk.codegen.model.intermediate.ShapeModel; +import software.amazon.awssdk.codegen.poet.ClassSpec; +import software.amazon.awssdk.codegen.poet.PoetExtensions; +import software.amazon.awssdk.codegen.poet.PoetUtils; +import software.amazon.awssdk.codegen.poet.transform.protocols.JsonMarshallerSpec; +import software.amazon.awssdk.codegen.poet.transform.protocols.MarshallerProtocolSpec; +import software.amazon.awssdk.core.Request; +import software.amazon.awssdk.core.exception.SdkClientException; +import software.amazon.awssdk.core.runtime.transform.Marshaller; +import software.amazon.awssdk.utils.Validate; + +public class MarshallerSpec implements ClassSpec { + + private final IntermediateModel intermediateModel; + private final ShapeModel shapeModel; + private final ClassName baseMashallerName; + private final TypeName requestWrapperName; + private final ClassName requestName; + private final ClassName className; + private final ClassName requestClassName; + private final MarshallerProtocolSpec protocolSpec; + + public MarshallerSpec(IntermediateModel intermediateModel, ShapeModel shapeModel) { + this.intermediateModel = intermediateModel; + this.shapeModel = shapeModel; + String modelPackage = intermediateModel.getMetadata().getFullModelPackageName(); + this.baseMashallerName = ClassName.get(Marshaller.class); + ClassName modelRequestClass = ClassName.get(modelPackage, shapeModel.getShapeName()); + this.requestWrapperName = ParameterizedTypeName.get(ClassName.get(Request.class), modelRequestClass); + this.requestName = ClassName.get(modelPackage, shapeModel.getShapeName()); + this.className = new PoetExtensions(intermediateModel).getRequestTransformClass(shapeModel.getShapeName() + "Marshaller"); + this.requestClassName = ClassName.get(modelPackage, shapeModel.getShapeName()); + this.protocolSpec = getProtocolSpecs(intermediateModel.getMetadata().getProtocol()); + } + + @Override + public TypeSpec poetSpec() { + return TypeSpec.classBuilder(className) + .addJavadoc("{@link $T} Marshaller", requestClassName) + .addModifiers(Modifier.PUBLIC) + .addAnnotation(PoetUtils.GENERATED) + .addAnnotation(SdkInternalApi.class) + .addSuperinterface( + ParameterizedTypeName.get(baseMashallerName, + requestWrapperName, + requestName)) + .addFields(protocolSpec.memberVariables()) + .addMethods(methods()) + .build(); + } + + + @Override + public ClassName className() { + return className; + } + + private List methods() { + List methodSpecs = new ArrayList<>(); + + protocolSpec.constructor().ifPresent(methodSpecs::add); + methodSpecs.add(marshallMethod()); + methodSpecs.addAll(protocolSpec.additionalMethods()); + return methodSpecs; + } + + private MethodSpec marshallMethod() { + String variableName = shapeModel.getVariable().getVariableName(); + MethodSpec.Builder methodSpecBuilder = MethodSpec.methodBuilder("marshall") + .addAnnotation(Override.class) + .addModifiers(Modifier.PUBLIC) + .addParameter(requestClassName, variableName) + .returns(requestWrapperName); + + methodSpecBuilder.addStatement("$T.paramNotNull($L, $S)", ClassName.get(Validate.class), variableName, variableName); + methodSpecBuilder.beginControlFlow("try"); + + methodSpecBuilder.addCode(protocolSpec.marshalCodeBlock(requestClassName)); + + methodSpecBuilder.endControlFlow(); + methodSpecBuilder.beginControlFlow("catch (Exception e)"); + methodSpecBuilder.addStatement("throw new $T(\"Unable to marshall request to JSON: \" + e.getMessage(), e)", ClassName + .get(SdkClientException.class)); + methodSpecBuilder.endControlFlow(); + return methodSpecBuilder.build(); + } + + private MarshallerProtocolSpec getProtocolSpecs(software.amazon.awssdk.codegen.model.intermediate.Protocol protocol) { + switch (protocol) { + case REST_JSON: + case CBOR: + case ION: + case AWS_JSON: + return new JsonMarshallerSpec(intermediateModel, shapeModel); + case QUERY: + case REST_XML: + case EC2: + case API_GATEWAY: + throw new UnsupportedOperationException("Not yet supported."); + default: + throw new RuntimeException("Unknown protocol: " + protocol.name()); + } + } +} diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/transform/protocols/JsonMarshallerSpec.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/transform/protocols/JsonMarshallerSpec.java new file mode 100644 index 000000000000..fb7719cbedd8 --- /dev/null +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/transform/protocols/JsonMarshallerSpec.java @@ -0,0 +1,132 @@ +/* + * Copyright 2010-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.codegen.poet.transform.protocols; + +import static software.amazon.awssdk.codegen.model.intermediate.Protocol.AWS_JSON; + +import com.squareup.javapoet.ClassName; +import com.squareup.javapoet.CodeBlock; +import com.squareup.javapoet.FieldSpec; +import com.squareup.javapoet.MethodSpec; +import com.squareup.javapoet.ParameterSpec; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import javax.lang.model.element.Modifier; +import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel; +import software.amazon.awssdk.codegen.model.intermediate.Metadata; +import software.amazon.awssdk.codegen.model.intermediate.ShapeModel; +import software.amazon.awssdk.codegen.poet.PoetExtensions; +import software.amazon.awssdk.core.http.HttpMethodName; +import software.amazon.awssdk.core.protocol.OperationInfo; +import software.amazon.awssdk.core.protocol.Protocol; +import software.amazon.awssdk.core.protocol.ProtocolRequestMarshaller; +import software.amazon.awssdk.core.protocol.json.SdkJsonProtocolFactory; +import software.amazon.awssdk.utils.StringUtils; + +/** + * MarshallerSpec for Json protocol + */ +public class JsonMarshallerSpec implements MarshallerProtocolSpec { + + private final Metadata metadata; + private final ShapeModel shapeModel; + private final PoetExtensions poetExtensions; + + public JsonMarshallerSpec(IntermediateModel model, ShapeModel shapeMode) { + this.metadata = model.getMetadata(); + this.poetExtensions = new PoetExtensions(model); + this.shapeModel = shapeMode; + } + + @Override + public ParameterSpec protocolFactoryParameter() { + return ParameterSpec.builder(SdkJsonProtocolFactory.class, "protocolFactory").build(); + } + + @Override + public Optional constructor() { + return Optional.of(MethodSpec.constructorBuilder() + .addModifiers(Modifier.PUBLIC) + .addParameter(protocolFactoryParameter()) + .addStatement("this.protocolFactory = protocolFactory") + .build()); + } + + @Override + public CodeBlock marshalCodeBlock(ClassName requestClassName) { + String variableName = shapeModel.getVariable().getVariableName(); + return CodeBlock.builder() + .addStatement("$T<$T> protocolMarshaller = protocolFactory.createProtocolMarshaller" + + "(SDK_OPERATION_BINDING, $L)", + ProtocolRequestMarshaller.class, + requestClassName, variableName) + .addStatement("protocolMarshaller.startMarshalling()") + .addStatement("$T.getInstance().marshall($L, protocolMarshaller)", + poetExtensions.getTransformClass(shapeModel.getShapeName() + "ModelMarshaller"), + variableName) + .addStatement("return protocolMarshaller.finishMarshalling()") + .build(); + } + + @Override + public FieldSpec protocolFactory() { + return FieldSpec.builder(SdkJsonProtocolFactory.class, "protocolFactory") + .addModifiers(Modifier.PRIVATE, Modifier.FINAL).build(); + } + + @Override + public List memberVariables() { + List fields = new ArrayList<>(); + + CodeBlock.Builder initializationCodeBlockBuilder = CodeBlock.builder() + .add("$T.builder()", OperationInfo.class); + initializationCodeBlockBuilder.add(".protocol($T.$L)", Protocol.class, protocolEnumName(metadata.getProtocol())) + .add(".requestUri($S)", shapeModel.getMarshaller().getRequestUri()) + .add(".httpMethodName($T.$L)", HttpMethodName.class, shapeModel.getMarshaller().getVerb()) + .add(".hasExplicitPayloadMember($L)", shapeModel.isHasPayloadMember()) + .add(".hasPayloadMembers($L)", shapeModel.hasPayloadMembers()); + + if (StringUtils.isNotBlank(shapeModel.getMarshaller().getTarget())) { + initializationCodeBlockBuilder.add(".operationIdentifier($S)", shapeModel.getMarshaller().getTarget()) + .add(".serviceName($S)", metadata.getServiceName()); + } + + CodeBlock codeBlock = initializationCodeBlockBuilder.add(".build()").build(); + + FieldSpec instance = FieldSpec.builder(ClassName.get(OperationInfo.class), "SDK_OPERATION_BINDING") + .addModifiers(Modifier.PRIVATE, Modifier.FINAL, Modifier.STATIC) + .initializer(codeBlock) + .build(); + + FieldSpec protocolFactory = protocolFactory(); + + fields.add(instance); + fields.add(protocolFactory); + return fields; + } + + private String protocolEnumName(software.amazon.awssdk.codegen.model.intermediate.Protocol protocol) { + switch (protocol) { + case CBOR: + case ION: + case AWS_JSON: + return AWS_JSON.name(); + default: + return protocol.name(); + } + } +} diff --git a/codegen/src/main/java/software/amazon/awssdk/codegen/poet/transform/protocols/MarshallerProtocolSpec.java b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/transform/protocols/MarshallerProtocolSpec.java new file mode 100644 index 000000000000..dc750b035052 --- /dev/null +++ b/codegen/src/main/java/software/amazon/awssdk/codegen/poet/transform/protocols/MarshallerProtocolSpec.java @@ -0,0 +1,46 @@ +/* + * Copyright 2010-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.codegen.poet.transform.protocols; + +import com.squareup.javapoet.ClassName; +import com.squareup.javapoet.CodeBlock; +import com.squareup.javapoet.FieldSpec; +import com.squareup.javapoet.MethodSpec; +import com.squareup.javapoet.ParameterSpec; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public interface MarshallerProtocolSpec { + + ParameterSpec protocolFactoryParameter(); + + CodeBlock marshalCodeBlock(ClassName requestClassName); + + FieldSpec protocolFactory(); + + default List memberVariables() { + return new ArrayList<>(); + } + + default List additionalMethods() { + return new ArrayList<>(); + } + + default Optional constructor() { + return Optional.empty(); + } +} diff --git a/codegen/src/main/resources/macros/glacier/UriGetMemberMarshallerMacro.ftl b/codegen/src/main/resources/macros/glacier/UriGetMemberMarshallerMacro.ftl deleted file mode 100644 index def6d8569a49..000000000000 --- a/codegen/src/main/resources/macros/glacier/UriGetMemberMarshallerMacro.ftl +++ /dev/null @@ -1,9 +0,0 @@ -<#macro content getterFunctionPrefix, member> - <#local getterCall=getterFunctionPrefix + "." + member.getterMethodName + "()"/> - <#-- If account id is not specified, we default to '-' which indicates the current account --> - <#if (member.http.uri && member.name == "AccountId")> - ${getterCall} == null ? "-" : ${getterCall} - <#else> - ${getterCall} - - diff --git a/codegen/src/main/resources/macros/glacier/WrapResponseStream.ftl b/codegen/src/main/resources/macros/glacier/WrapResponseStream.ftl deleted file mode 100644 index 0a37a6101eec..000000000000 --- a/codegen/src/main/resources/macros/glacier/WrapResponseStream.ftl +++ /dev/null @@ -1,15 +0,0 @@ -<#macro content operationModel> - -<#if operationModel.operationName == "GetJobOutput"> - -GetJobOutputResult result = response.getAwsResponse(); - -// wrapping the response with the LengthCheckInputStream. -result.setBody(new LengthCheckInputStream(result.getBody(), Long.parseLong(response.getHttpResponse().getHeaders().get("Content-Length")), software.amazon.awssdk.core.util.LengthCheckInputStream.INCLUDE_SKIPPED_BYTES)); - -// wrapping the response with the service client holder input stream to avoid client being GC'ed. -result.setBody(new ServiceClientHolderInputStream(result.getBody(), this)); - - - - diff --git a/codegen/src/main/resources/macros/marshaller/json/RequestMarshallerCreation.ftl b/codegen/src/main/resources/macros/marshaller/json/RequestMarshallerCreation.ftl deleted file mode 100644 index 30c4f89f0543..000000000000 --- a/codegen/src/main/resources/macros/marshaller/json/RequestMarshallerCreation.ftl +++ /dev/null @@ -1,3 +0,0 @@ -<#macro content operationModel> - new ${operationModel.input.variableType}Marshaller(protocolFactory) - diff --git a/codegen/src/main/resources/macros/marshaller/rest-json/NoOpElseWriteExplicitJsonNull.ftl b/codegen/src/main/resources/macros/marshaller/rest-json/NoOpElseWriteExplicitJsonNull.ftl deleted file mode 100644 index 877cf6a23f5b..000000000000 --- a/codegen/src/main/resources/macros/marshaller/rest-json/NoOpElseWriteExplicitJsonNull.ftl +++ /dev/null @@ -1,6 +0,0 @@ - -<#macro content> - diff --git a/codegen/src/main/resources/templates/json/ShapeJsonMarshaller.ftl b/codegen/src/main/resources/templates/json/ShapeJsonMarshaller.ftl deleted file mode 100644 index dc9a854340ae..000000000000 --- a/codegen/src/main/resources/templates/json/ShapeJsonMarshaller.ftl +++ /dev/null @@ -1,6 +0,0 @@ -<#assign shape = shapes[shapeName]/> -<#if shape.type = "Request"> -<@RequestMarshallerMacro.content .data_model/> -<#else> -<@ModelMarshallerMacro.content .data_model/> - diff --git a/codegen/src/test/java/software/amazon/awssdk/codegen/poet/transform/CustomDefaultValueSupplier.java b/codegen/src/test/java/software/amazon/awssdk/codegen/poet/transform/CustomDefaultValueSupplier.java new file mode 100644 index 000000000000..4f5d47a518ac --- /dev/null +++ b/codegen/src/test/java/software/amazon/awssdk/codegen/poet/transform/CustomDefaultValueSupplier.java @@ -0,0 +1,36 @@ +/* + * Copyright 2010-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.awssdk.codegen.poet.transform; + +import java.util.function.Supplier; + +public class CustomDefaultValueSupplier { + + /** + * Value that indicates the current account. + */ + private static final String VALUE = "BLAHBLAH"; + + private static final Supplier INSTANCE = () -> VALUE; + + private CustomDefaultValueSupplier() { + } + + public static Supplier getInstance() { + return INSTANCE; + } + +} diff --git a/codegen/src/test/java/software/amazon/awssdk/codegen/poet/transform/JsonModelMarshallerSpecTest.java b/codegen/src/test/java/software/amazon/awssdk/codegen/poet/transform/JsonModelMarshallerSpecTest.java new file mode 100644 index 000000000000..4b7b7097598e --- /dev/null +++ b/codegen/src/test/java/software/amazon/awssdk/codegen/poet/transform/JsonModelMarshallerSpecTest.java @@ -0,0 +1,65 @@ +package software.amazon.awssdk.codegen.poet.transform; + +import static java.util.stream.Collectors.toList; +import static org.hamcrest.MatcherAssert.assertThat; +import static software.amazon.awssdk.codegen.poet.PoetMatchers.generatesTo; +import static software.amazon.awssdk.utils.FunctionalUtils.invokeSafely; + +import java.io.File; +import java.io.IOException; +import java.util.Collection; +import java.util.Locale; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import software.amazon.awssdk.codegen.C2jModels; +import software.amazon.awssdk.codegen.IntermediateModelBuilder; +import software.amazon.awssdk.codegen.model.config.customization.CustomizationConfig; +import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel; +import software.amazon.awssdk.codegen.model.intermediate.ShapeModel; +import software.amazon.awssdk.codegen.model.service.ServiceModel; +import software.amazon.awssdk.codegen.utils.ModelLoaderUtils; + +@RunWith(Parameterized.class) +public class JsonModelMarshallerSpecTest { + private static IntermediateModel intermediateModel; + private final ShapeModel shapeModel; + + @Parameterized.Parameters(name = "{0}") + public static Collection data() { + invokeSafely(JsonModelMarshallerSpecTest::setUp); + return intermediateModel.getShapes().values().stream() + .filter(shape -> "Request".equals(shape.getType())) + .map(shape -> new Object[] {shape}).collect(toList()); + } + + public JsonModelMarshallerSpecTest(ShapeModel shapeModel) { + this.shapeModel = shapeModel; + } + + @Test + public void basicGeneration() { + assertThat(new JsonModelMarshallerSpec(intermediateModel, shapeModel, "ModelMarshaller"), generatesTo(referenceFileForShape())); + } + + private String referenceFileForShape() { + return shapeModel.getShapeName().toLowerCase(Locale.ENGLISH) + "modelmarshaller.java"; + } + + private static void setUp() throws IOException { + File serviceModelFile = new File(JsonModelMarshallerSpecTest.class.getResource("service-2.json").getFile()); + File customizationConfigFile = new File(JsonModelMarshallerSpecTest.class + .getResource("customization.config") + .getFile()); + + intermediateModel = new IntermediateModelBuilder( + C2jModels.builder() + .serviceModel(ModelLoaderUtils.loadModel(ServiceModel.class, serviceModelFile)) + .customizationConfig(ModelLoaderUtils.loadModel(CustomizationConfig.class, customizationConfigFile)) + .build()) + .build(); + + + } + +} diff --git a/codegen/src/test/java/software/amazon/awssdk/codegen/poet/transform/MarshallerSpecTest.java b/codegen/src/test/java/software/amazon/awssdk/codegen/poet/transform/MarshallerSpecTest.java new file mode 100644 index 000000000000..df6aa1b649ec --- /dev/null +++ b/codegen/src/test/java/software/amazon/awssdk/codegen/poet/transform/MarshallerSpecTest.java @@ -0,0 +1,62 @@ +package software.amazon.awssdk.codegen.poet.transform; + +import static java.util.stream.Collectors.toList; +import static org.hamcrest.MatcherAssert.assertThat; +import static software.amazon.awssdk.codegen.poet.PoetMatchers.generatesTo; +import static software.amazon.awssdk.utils.FunctionalUtils.invokeSafely; + +import java.io.File; +import java.io.IOException; +import java.util.Collection; +import java.util.Locale; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import software.amazon.awssdk.codegen.C2jModels; +import software.amazon.awssdk.codegen.IntermediateModelBuilder; +import software.amazon.awssdk.codegen.model.config.customization.CustomizationConfig; +import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel; +import software.amazon.awssdk.codegen.model.intermediate.ShapeModel; +import software.amazon.awssdk.codegen.model.service.ServiceModel; +import software.amazon.awssdk.codegen.utils.ModelLoaderUtils; + +@RunWith(Parameterized.class) +public class MarshallerSpecTest { + private static IntermediateModel intermediateModel; + private final ShapeModel shapeModel; + + @Parameterized.Parameters(name = "{0}") + public static Collection data() { + invokeSafely(MarshallerSpecTest::setUp); + return intermediateModel.getShapes().values().stream() + .filter(shape -> "Request".equals(shape.getType())) + .map(shape -> new Object[] {shape}).collect(toList()); + } + + public MarshallerSpecTest(ShapeModel shapeModel) { + this.shapeModel = shapeModel; + } + + @Test + public void basicGeneration() { + assertThat(new MarshallerSpec(intermediateModel, shapeModel), generatesTo(referenceFileForShape())); + } + + private String referenceFileForShape() { + return shapeModel.getShapeName().toLowerCase(Locale.ENGLISH) + "marshaller.java"; + } + + private static void setUp() throws IOException { + File serviceModelFile = new File(MarshallerSpecTest.class.getResource("service-2.json").getFile()); + File customizationConfigFile = new File(MarshallerSpecTest.class + .getResource("customization.config") + .getFile()); + + intermediateModel = new IntermediateModelBuilder( + C2jModels.builder() + .serviceModel(ModelLoaderUtils.loadModel(ServiceModel.class, serviceModelFile)) + .customizationConfig(ModelLoaderUtils.loadModel(CustomizationConfig.class, customizationConfigFile)) + .build()) + .build(); + } +} diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/alltypesrequestmarshaller.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/alltypesrequestmarshaller.java new file mode 100644 index 000000000000..753effac4507 --- /dev/null +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/alltypesrequestmarshaller.java @@ -0,0 +1,44 @@ +package software.amazon.awssdk.services.jsonprotocoltests.transform; + +import javax.annotation.Generated; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.core.Request; +import software.amazon.awssdk.core.exception.SdkClientException; +import software.amazon.awssdk.core.http.HttpMethodName; +import software.amazon.awssdk.core.protocol.OperationInfo; +import software.amazon.awssdk.core.protocol.Protocol; +import software.amazon.awssdk.core.protocol.ProtocolRequestMarshaller; +import software.amazon.awssdk.core.protocol.json.SdkJsonProtocolFactory; +import software.amazon.awssdk.core.runtime.transform.Marshaller; +import software.amazon.awssdk.services.jsonprotocoltests.model.AllTypesRequest; +import software.amazon.awssdk.utils.Validate; + +/** + * {@link AllTypesRequest} Marshaller + */ +@Generated("software.amazon.awssdk:codegen") +@SdkInternalApi +public class AllTypesRequestMarshaller implements Marshaller, AllTypesRequest> { + private static final OperationInfo SDK_OPERATION_BINDING = OperationInfo.builder().protocol(Protocol.REST_JSON) + .requestUri("/").httpMethodName(HttpMethodName.POST).hasExplicitPayloadMember(false).hasPayloadMembers(true).build(); + + private final SdkJsonProtocolFactory protocolFactory; + + public AllTypesRequestMarshaller(SdkJsonProtocolFactory protocolFactory) { + this.protocolFactory = protocolFactory; + } + + @Override + public Request marshall(AllTypesRequest allTypesRequest) { + Validate.paramNotNull(allTypesRequest, "allTypesRequest"); + try { + ProtocolRequestMarshaller protocolMarshaller = protocolFactory.createProtocolMarshaller( + SDK_OPERATION_BINDING, allTypesRequest); + protocolMarshaller.startMarshalling(); + AllTypesRequestModelMarshaller.getInstance().marshall(allTypesRequest, protocolMarshaller); + return protocolMarshaller.finishMarshalling(); + } catch (Exception e) { + throw new SdkClientException("Unable to marshall request to JSON: " + e.getMessage(), e); + } + } +} diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/alltypesrequestmodelmarshaller.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/alltypesrequestmodelmarshaller.java new file mode 100644 index 000000000000..227bdf55a3ca --- /dev/null +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/alltypesrequestmodelmarshaller.java @@ -0,0 +1,159 @@ +package software.amazon.awssdk.services.jsonprotocoltests.transform; + +import java.nio.ByteBuffer; +import java.time.Instant; +import java.util.List; +import java.util.Map; +import javax.annotation.Generated; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.core.exception.SdkClientException; +import software.amazon.awssdk.core.protocol.MarshallLocation; +import software.amazon.awssdk.core.protocol.MarshallingInfo; +import software.amazon.awssdk.core.protocol.MarshallingType; +import software.amazon.awssdk.core.protocol.ProtocolMarshaller; +import software.amazon.awssdk.core.protocol.StructuredPojo; +import software.amazon.awssdk.services.jsonprotocoltests.model.AllTypesRequest; +import software.amazon.awssdk.utils.Validate; + +/** + * {@link AllTypesRequest} Marshaller + */ +@Generated("software.amazon.awssdk:codegen") +@SdkInternalApi +public class AllTypesRequestModelMarshaller { + private static final MarshallingInfo STRINGMEMBER_BINDING = MarshallingInfo.builder(MarshallingType.STRING) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("StringMember").isBinary(false) + .defaultValueSupplier(software.amazon.awssdk.codegen.poet.transform.CustomDefaultValueSupplier.getInstance()).build(); + + private static final MarshallingInfo INTEGERMEMBER_BINDING = MarshallingInfo.builder(MarshallingType.INTEGER) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("IntegerMember").isBinary(false).build(); + + private static final MarshallingInfo BOOLEANMEMBER_BINDING = MarshallingInfo.builder(MarshallingType.BOOLEAN) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("BooleanMember").isBinary(false).build(); + + private static final MarshallingInfo FLOATMEMBER_BINDING = MarshallingInfo.builder(MarshallingType.FLOAT) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("FloatMember").isBinary(false).build(); + + private static final MarshallingInfo DOUBLEMEMBER_BINDING = MarshallingInfo.builder(MarshallingType.DOUBLE) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("DoubleMember").isBinary(false).build(); + + private static final MarshallingInfo LONGMEMBER_BINDING = MarshallingInfo.builder(MarshallingType.LONG) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("LongMember").isBinary(false).build(); + + private static final MarshallingInfo SIMPLELIST_BINDING = MarshallingInfo.builder(MarshallingType.LIST) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("SimpleList").isBinary(false).build(); + + private static final MarshallingInfo LISTOFENUMS_BINDING = MarshallingInfo.builder(MarshallingType.LIST) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("ListOfEnums").isBinary(false).build(); + + private static final MarshallingInfo LISTOFMAPS_BINDING = MarshallingInfo.builder(MarshallingType.LIST) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("ListOfMaps").isBinary(false).build(); + + private static final MarshallingInfo LISTOFSTRUCTS_BINDING = MarshallingInfo.builder(MarshallingType.LIST) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("ListOfStructs").isBinary(false).build(); + + private static final MarshallingInfo MAPOFSTRINGTOINTEGERLIST_BINDING = MarshallingInfo.builder(MarshallingType.MAP) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("MapOfStringToIntegerList").isBinary(false).build(); + + private static final MarshallingInfo MAPOFSTRINGTOSTRING_BINDING = MarshallingInfo.builder(MarshallingType.MAP) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("MapOfStringToString").isBinary(false).build(); + + private static final MarshallingInfo MAPOFSTRINGTOSIMPLESTRUCT_BINDING = MarshallingInfo.builder(MarshallingType.MAP) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("MapOfStringToSimpleStruct").isBinary(false).build(); + + private static final MarshallingInfo MAPOFENUMTOENUM_BINDING = MarshallingInfo.builder(MarshallingType.MAP) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("MapOfEnumToEnum").isBinary(false).build(); + + private static final MarshallingInfo MAPOFENUMTOSTRING_BINDING = MarshallingInfo.builder(MarshallingType.MAP) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("MapOfEnumToString").isBinary(false).build(); + + private static final MarshallingInfo MAPOFSTRINGTOENUM_BINDING = MarshallingInfo.builder(MarshallingType.MAP) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("MapOfStringToEnum").isBinary(false).build(); + + private static final MarshallingInfo MAPOFENUMTOSIMPLESTRUCT_BINDING = MarshallingInfo.builder(MarshallingType.MAP) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("MapOfEnumToSimpleStruct").isBinary(false).build(); + + private static final MarshallingInfo TIMESTAMPMEMBER_BINDING = MarshallingInfo.builder(MarshallingType.INSTANT) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("TimestampMember").isBinary(false).build(); + + private static final MarshallingInfo STRUCTWITHNESTEDTIMESTAMPMEMBER_BINDING = MarshallingInfo + .builder(MarshallingType.STRUCTURED).marshallLocation(MarshallLocation.PAYLOAD) + .marshallLocationName("StructWithNestedTimestampMember").isBinary(false).build(); + + private static final MarshallingInfo BLOBARG_BINDING = MarshallingInfo.builder(MarshallingType.BYTE_BUFFER) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("BlobArg").isBinary(false).build(); + + private static final MarshallingInfo STRUCTWITHNESTEDBLOB_BINDING = MarshallingInfo + .builder(MarshallingType.STRUCTURED).marshallLocation(MarshallLocation.PAYLOAD) + .marshallLocationName("StructWithNestedBlob").isBinary(false).build(); + + private static final MarshallingInfo BLOBMAP_BINDING = MarshallingInfo.builder(MarshallingType.MAP) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("BlobMap").isBinary(false).build(); + + private static final MarshallingInfo LISTOFBLOBS_BINDING = MarshallingInfo.builder(MarshallingType.LIST) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("ListOfBlobs").isBinary(false).build(); + + private static final MarshallingInfo RECURSIVESTRUCT_BINDING = MarshallingInfo + .builder(MarshallingType.STRUCTURED).marshallLocation(MarshallLocation.PAYLOAD) + .marshallLocationName("RecursiveStruct").isBinary(false).build(); + + private static final MarshallingInfo POLYMORPHICTYPEWITHSUBTYPES_BINDING = MarshallingInfo + .builder(MarshallingType.STRUCTURED).marshallLocation(MarshallLocation.PAYLOAD) + .marshallLocationName("PolymorphicTypeWithSubTypes").isBinary(false).build(); + + private static final MarshallingInfo POLYMORPHICTYPEWITHOUTSUBTYPES_BINDING = MarshallingInfo + .builder(MarshallingType.STRUCTURED).marshallLocation(MarshallLocation.PAYLOAD) + .marshallLocationName("PolymorphicTypeWithoutSubTypes").isBinary(false).build(); + + private static final MarshallingInfo ENUMTYPE_BINDING = MarshallingInfo.builder(MarshallingType.STRING) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("EnumType").isBinary(false).build(); + + private static final AllTypesRequestModelMarshaller INSTANCE = new AllTypesRequestModelMarshaller(); + + private AllTypesRequestModelMarshaller() { + } + + public static AllTypesRequestModelMarshaller getInstance() { + return INSTANCE; + } + + /** + * Marshall the given parameter object + */ + public void marshall(AllTypesRequest allTypesRequest, ProtocolMarshaller protocolMarshaller) { + Validate.paramNotNull(allTypesRequest, "allTypesRequest"); + Validate.paramNotNull(protocolMarshaller, "protocolMarshaller"); + try { + protocolMarshaller.marshall(allTypesRequest.stringMember(), STRINGMEMBER_BINDING); + protocolMarshaller.marshall(allTypesRequest.integerMember(), INTEGERMEMBER_BINDING); + protocolMarshaller.marshall(allTypesRequest.booleanMember(), BOOLEANMEMBER_BINDING); + protocolMarshaller.marshall(allTypesRequest.floatMember(), FLOATMEMBER_BINDING); + protocolMarshaller.marshall(allTypesRequest.doubleMember(), DOUBLEMEMBER_BINDING); + protocolMarshaller.marshall(allTypesRequest.longMember(), LONGMEMBER_BINDING); + protocolMarshaller.marshall(allTypesRequest.simpleList(), SIMPLELIST_BINDING); + protocolMarshaller.marshall(allTypesRequest.listOfEnumsStrings(), LISTOFENUMS_BINDING); + protocolMarshaller.marshall(allTypesRequest.listOfMaps(), LISTOFMAPS_BINDING); + protocolMarshaller.marshall(allTypesRequest.listOfStructs(), LISTOFSTRUCTS_BINDING); + protocolMarshaller.marshall(allTypesRequest.mapOfStringToIntegerList(), MAPOFSTRINGTOINTEGERLIST_BINDING); + protocolMarshaller.marshall(allTypesRequest.mapOfStringToString(), MAPOFSTRINGTOSTRING_BINDING); + protocolMarshaller.marshall(allTypesRequest.mapOfStringToSimpleStruct(), MAPOFSTRINGTOSIMPLESTRUCT_BINDING); + protocolMarshaller.marshall(allTypesRequest.mapOfEnumToEnumStrings(), MAPOFENUMTOENUM_BINDING); + protocolMarshaller.marshall(allTypesRequest.mapOfEnumToStringStrings(), MAPOFENUMTOSTRING_BINDING); + protocolMarshaller.marshall(allTypesRequest.mapOfStringToEnumStrings(), MAPOFSTRINGTOENUM_BINDING); + protocolMarshaller.marshall(allTypesRequest.mapOfEnumToSimpleStructStrings(), MAPOFENUMTOSIMPLESTRUCT_BINDING); + protocolMarshaller.marshall(allTypesRequest.timestampMember(), TIMESTAMPMEMBER_BINDING); + protocolMarshaller.marshall(allTypesRequest.structWithNestedTimestampMember(), + STRUCTWITHNESTEDTIMESTAMPMEMBER_BINDING); + protocolMarshaller.marshall(allTypesRequest.blobArg(), BLOBARG_BINDING); + protocolMarshaller.marshall(allTypesRequest.structWithNestedBlob(), STRUCTWITHNESTEDBLOB_BINDING); + protocolMarshaller.marshall(allTypesRequest.blobMap(), BLOBMAP_BINDING); + protocolMarshaller.marshall(allTypesRequest.listOfBlobs(), LISTOFBLOBS_BINDING); + protocolMarshaller.marshall(allTypesRequest.recursiveStruct(), RECURSIVESTRUCT_BINDING); + protocolMarshaller.marshall(allTypesRequest.polymorphicTypeWithSubTypes(), POLYMORPHICTYPEWITHSUBTYPES_BINDING); + protocolMarshaller.marshall(allTypesRequest.polymorphicTypeWithoutSubTypes(), POLYMORPHICTYPEWITHOUTSUBTYPES_BINDING); + protocolMarshaller.marshall(allTypesRequest.enumTypeString(), ENUMTYPE_BINDING); + } catch (Exception e) { + throw new SdkClientException("Unable to marshall request to JSON: " + e.getMessage(), e); + } + } +} diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/customization.config b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/customization.config new file mode 100644 index 000000000000..8efd29387983 --- /dev/null +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/customization.config @@ -0,0 +1,10 @@ +{ + "blacklistedSimpleMethods" : [ + "allTypes", + "nestedContainers", + "operationWithNoInputOrOutput" + ], + "modelMarshallerDefaultValueSupplier": { + "StringMember" : "software.amazon.awssdk.codegen.poet.transform.CustomDefaultValueSupplier.getInstance()" + } +} \ No newline at end of file diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/nestedcontainersrequestmarshaller.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/nestedcontainersrequestmarshaller.java new file mode 100644 index 000000000000..da89c659e9de --- /dev/null +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/nestedcontainersrequestmarshaller.java @@ -0,0 +1,44 @@ +package software.amazon.awssdk.services.jsonprotocoltests.transform; + +import javax.annotation.Generated; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.core.Request; +import software.amazon.awssdk.core.exception.SdkClientException; +import software.amazon.awssdk.core.http.HttpMethodName; +import software.amazon.awssdk.core.protocol.OperationInfo; +import software.amazon.awssdk.core.protocol.Protocol; +import software.amazon.awssdk.core.protocol.ProtocolRequestMarshaller; +import software.amazon.awssdk.core.protocol.json.SdkJsonProtocolFactory; +import software.amazon.awssdk.core.runtime.transform.Marshaller; +import software.amazon.awssdk.services.jsonprotocoltests.model.NestedContainersRequest; +import software.amazon.awssdk.utils.Validate; + +/** + * {@link NestedContainersRequest} Marshaller + */ +@Generated("software.amazon.awssdk:codegen") +@SdkInternalApi +public class NestedContainersRequestMarshaller implements Marshaller, NestedContainersRequest> { + private static final OperationInfo SDK_OPERATION_BINDING = OperationInfo.builder().protocol(Protocol.REST_JSON) + .requestUri("/").httpMethodName(HttpMethodName.POST).hasExplicitPayloadMember(false).hasPayloadMembers(true).build(); + + private final SdkJsonProtocolFactory protocolFactory; + + public NestedContainersRequestMarshaller(SdkJsonProtocolFactory protocolFactory) { + this.protocolFactory = protocolFactory; + } + + @Override + public Request marshall(NestedContainersRequest nestedContainersRequest) { + Validate.paramNotNull(nestedContainersRequest, "nestedContainersRequest"); + try { + ProtocolRequestMarshaller protocolMarshaller = protocolFactory.createProtocolMarshaller( + SDK_OPERATION_BINDING, nestedContainersRequest); + protocolMarshaller.startMarshalling(); + NestedContainersRequestModelMarshaller.getInstance().marshall(nestedContainersRequest, protocolMarshaller); + return protocolMarshaller.finishMarshalling(); + } catch (Exception e) { + throw new SdkClientException("Unable to marshall request to JSON: " + e.getMessage(), e); + } + } +} diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/nestedcontainersrequestmodelmarshaller.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/nestedcontainersrequestmodelmarshaller.java new file mode 100644 index 000000000000..801204606676 --- /dev/null +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/nestedcontainersrequestmodelmarshaller.java @@ -0,0 +1,55 @@ +package software.amazon.awssdk.services.jsonprotocoltests.transform; + +import java.util.List; +import java.util.Map; +import javax.annotation.Generated; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.core.exception.SdkClientException; +import software.amazon.awssdk.core.protocol.MarshallLocation; +import software.amazon.awssdk.core.protocol.MarshallingInfo; +import software.amazon.awssdk.core.protocol.MarshallingType; +import software.amazon.awssdk.core.protocol.ProtocolMarshaller; +import software.amazon.awssdk.services.jsonprotocoltests.model.NestedContainersRequest; +import software.amazon.awssdk.utils.Validate; + +/** + * {@link NestedContainersRequest} Marshaller + */ +@Generated("software.amazon.awssdk:codegen") +@SdkInternalApi +public class NestedContainersRequestModelMarshaller { + private static final MarshallingInfo LISTOFLISTOFSTRINGS_BINDING = MarshallingInfo.builder(MarshallingType.LIST) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("ListOfListOfStrings").isBinary(false).build(); + + private static final MarshallingInfo LISTOFLISTOFLISTOFSTRINGS_BINDING = MarshallingInfo.builder(MarshallingType.LIST) + .marshallLocation(MarshallLocation.PAYLOAD).marshallLocationName("ListOfListOfListOfStrings").isBinary(false).build(); + + private static final MarshallingInfo MAPOFSTRINGTOLISTOFLISTOFSTRINGS_BINDING = MarshallingInfo + .builder(MarshallingType.MAP).marshallLocation(MarshallLocation.PAYLOAD) + .marshallLocationName("MapOfStringToListOfListOfStrings").isBinary(false).build(); + + private static final NestedContainersRequestModelMarshaller INSTANCE = new NestedContainersRequestModelMarshaller(); + + private NestedContainersRequestModelMarshaller() { + } + + public static NestedContainersRequestModelMarshaller getInstance() { + return INSTANCE; + } + + /** + * Marshall the given parameter object + */ + public void marshall(NestedContainersRequest nestedContainersRequest, ProtocolMarshaller protocolMarshaller) { + Validate.paramNotNull(nestedContainersRequest, "nestedContainersRequest"); + Validate.paramNotNull(protocolMarshaller, "protocolMarshaller"); + try { + protocolMarshaller.marshall(nestedContainersRequest.listOfListOfStrings(), LISTOFLISTOFSTRINGS_BINDING); + protocolMarshaller.marshall(nestedContainersRequest.listOfListOfListOfStrings(), LISTOFLISTOFLISTOFSTRINGS_BINDING); + protocolMarshaller.marshall(nestedContainersRequest.mapOfStringToListOfListOfStrings(), + MAPOFSTRINGTOLISTOFLISTOFSTRINGS_BINDING); + } catch (Exception e) { + throw new SdkClientException("Unable to marshall request to JSON: " + e.getMessage(), e); + } + } +} diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/operationwithnoinputoroutputrequestmarshaller.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/operationwithnoinputoroutputrequestmarshaller.java new file mode 100644 index 000000000000..a9be127cc929 --- /dev/null +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/operationwithnoinputoroutputrequestmarshaller.java @@ -0,0 +1,47 @@ +package software.amazon.awssdk.services.jsonprotocoltests.transform; + +import javax.annotation.Generated; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.core.Request; +import software.amazon.awssdk.core.exception.SdkClientException; +import software.amazon.awssdk.core.http.HttpMethodName; +import software.amazon.awssdk.core.protocol.OperationInfo; +import software.amazon.awssdk.core.protocol.Protocol; +import software.amazon.awssdk.core.protocol.ProtocolRequestMarshaller; +import software.amazon.awssdk.core.protocol.json.SdkJsonProtocolFactory; +import software.amazon.awssdk.core.runtime.transform.Marshaller; +import software.amazon.awssdk.services.jsonprotocoltests.model.OperationWithNoInputOrOutputRequest; +import software.amazon.awssdk.utils.Validate; + +/** + * {@link OperationWithNoInputOrOutputRequest} Marshaller + */ +@Generated("software.amazon.awssdk:codegen") +@SdkInternalApi +public class OperationWithNoInputOrOutputRequestMarshaller implements + Marshaller, OperationWithNoInputOrOutputRequest> { + private static final OperationInfo SDK_OPERATION_BINDING = OperationInfo.builder().protocol(Protocol.REST_JSON) + .requestUri("/").httpMethodName(HttpMethodName.POST).hasExplicitPayloadMember(false).hasPayloadMembers(false).build(); + + private final SdkJsonProtocolFactory protocolFactory; + + public OperationWithNoInputOrOutputRequestMarshaller(SdkJsonProtocolFactory protocolFactory) { + this.protocolFactory = protocolFactory; + } + + @Override + public Request marshall( + OperationWithNoInputOrOutputRequest operationWithNoInputOrOutputRequest) { + Validate.paramNotNull(operationWithNoInputOrOutputRequest, "operationWithNoInputOrOutputRequest"); + try { + ProtocolRequestMarshaller protocolMarshaller = protocolFactory + .createProtocolMarshaller(SDK_OPERATION_BINDING, operationWithNoInputOrOutputRequest); + protocolMarshaller.startMarshalling(); + OperationWithNoInputOrOutputRequestModelMarshaller.getInstance().marshall(operationWithNoInputOrOutputRequest, + protocolMarshaller); + return protocolMarshaller.finishMarshalling(); + } catch (Exception e) { + throw new SdkClientException("Unable to marshall request to JSON: " + e.getMessage(), e); + } + } +} diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/operationwithnoinputoroutputrequestmodelmarshaller.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/operationwithnoinputoroutputrequestmodelmarshaller.java new file mode 100644 index 000000000000..3220ba5e9930 --- /dev/null +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/operationwithnoinputoroutputrequestmodelmarshaller.java @@ -0,0 +1,29 @@ +package software.amazon.awssdk.services.jsonprotocoltests.transform; + +import javax.annotation.Generated; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.core.protocol.ProtocolMarshaller; +import software.amazon.awssdk.services.jsonprotocoltests.model.OperationWithNoInputOrOutputRequest; + +/** + * {@link OperationWithNoInputOrOutputRequest} Marshaller + */ +@Generated("software.amazon.awssdk:codegen") +@SdkInternalApi +public class OperationWithNoInputOrOutputRequestModelMarshaller { + private static final OperationWithNoInputOrOutputRequestModelMarshaller INSTANCE = new OperationWithNoInputOrOutputRequestModelMarshaller(); + + private OperationWithNoInputOrOutputRequestModelMarshaller() { + } + + public static OperationWithNoInputOrOutputRequestModelMarshaller getInstance() { + return INSTANCE; + } + + /** + * Marshall the given parameter object + */ + public void marshall(OperationWithNoInputOrOutputRequest operationWithNoInputOrOutputRequest, + ProtocolMarshaller protocolMarshaller) { + } +} diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/service-2.json b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/service-2.json new file mode 100644 index 000000000000..800b15d62612 --- /dev/null +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/service-2.json @@ -0,0 +1,268 @@ +{ + "version":"2.0", + "metadata":{ + "apiVersion":"2016-03-11", + "endpointPrefix":"restjson", + "jsonVersion":"1.1", + "protocol":"rest-json", + "serviceAbbreviation":"JsonProtocolTests", + "serviceFullName":"AWS DR Tools JSON Protocol Tests", + "signatureVersion":"v4", + "targetPrefix":"ProtocolTestsJsonRpcService", + "timestampFormat":"unixTimestamp", + "uid":"restjson-2016-03-11" + }, + "operations":{ + "AllTypes":{ + "name":"AllTypes", + "http":{ + "method":"POST", + "requestUri":"/" + }, + "input":{"shape":"AllTypesStructure"}, + "output":{"shape":"AllTypesStructure"}, + "errors":[ + {"shape":"EmptyModeledException"} + ] + }, + "NestedContainers":{ + "name":"NestedContainers", + "http":{ + "method":"POST", + "requestUri":"/" + }, + "input":{"shape":"NestedContainersStructure"}, + "output":{"shape":"NestedContainersStructure"} + }, + "OperationWithNoInputOrOutput":{ + "name":"OperationWithNoInputOrOutput", + "http":{ + "method":"POST", + "requestUri":"/" + } + }, + "StreamingInputOperation":{ + "name":"StreamingInputOperation", + "http":{ + "method":"POST", + "requestUri":"/2016-03-11/streamingInputOperation" + }, + "input":{"shape":"StructureWithStreamingMember"} + }, + "StreamingOutputOperation":{ + "name":"StreamingOutputOperation", + "http":{ + "method":"POST", + "requestUri":"/2016-03-11/streamingOutputOperation" + }, + "output":{"shape":"StructureWithStreamingMember"} + } + }, + "shapes":{ + "AllTypesStructure":{ + "type":"structure", + "members":{ + "StringMember":{"shape":"String"}, + "IntegerMember":{"shape":"Integer"}, + "BooleanMember":{"shape":"Boolean"}, + "FloatMember":{"shape":"Float"}, + "DoubleMember":{"shape":"Double"}, + "LongMember":{"shape":"Long"}, + "SimpleList":{"shape":"ListOfStrings"}, + "ListOfEnums":{"shape":"ListOfEnums"}, + "ListOfMaps":{"shape":"ListOfMapStringToString"}, + "ListOfStructs":{"shape":"ListOfSimpleStructs"}, + "MapOfStringToIntegerList":{"shape":"MapOfStringToIntegerList"}, + "MapOfStringToString":{"shape":"MapOfStringToString"}, + "MapOfStringToSimpleStruct":{"shape":"MapOfStringToSimpleStruct"}, + "MapOfEnumToEnum":{"shape":"MapOfEnumToEnum"}, + "MapOfEnumToString":{"shape":"MapOfEnumToString"}, + "MapOfStringToEnum":{"shape":"MapOfStringToEnum"}, + "MapOfEnumToSimpleStruct":{"shape":"MapOfEnumToSimpleStruct"}, + "TimestampMember":{"shape":"Timestamp"}, + "StructWithNestedTimestampMember":{"shape":"StructWithTimestamp"}, + "BlobArg":{"shape":"BlobType"}, + "StructWithNestedBlob":{"shape":"StructWithNestedBlobType"}, + "BlobMap":{"shape":"BlobMapType"}, + "ListOfBlobs":{"shape":"ListOfBlobsType"}, + "RecursiveStruct":{"shape":"RecursiveStructType"}, + "PolymorphicTypeWithSubTypes":{"shape":"BaseType"}, + "PolymorphicTypeWithoutSubTypes":{"shape":"SubTypeOne"}, + "EnumType":{"shape":"EnumType"} + } + }, + "BaseType":{ + "type":"structure", + "members":{ + "BaseMember":{"shape":"String"} + } + }, + "BlobMapType":{ + "type":"map", + "key":{"shape":"String"}, + "value":{"shape":"BlobType"} + }, + "BlobType":{"type":"blob"}, + "Boolean":{"type":"boolean"}, + "Double":{"type":"double"}, + "EmptyModeledException":{ + "type":"structure", + "members":{ + }, + "exception":true + }, + "Float":{"type":"float"}, + "IdempotentOperationStructure":{ + "type":"structure", + "members":{ + "IdempotencyToken":{ + "shape":"String", + "idempotencyToken":true + } + } + }, + "Integer":{"type":"integer"}, + "ListOfBlobsType":{ + "type":"list", + "member":{"shape":"BlobType"} + }, + "ListOfIntegers":{ + "type":"list", + "member":{"shape":"Integer"} + }, + "ListOfListOfListOfStrings":{ + "type":"list", + "member":{"shape":"ListOfListOfStrings"} + }, + "ListOfListOfStrings":{ + "type":"list", + "member":{"shape":"ListOfStrings"} + }, + "ListOfMapStringToString":{ + "type":"list", + "member":{"shape":"MapOfStringToString"} + }, + "ListOfSimpleStructs":{ + "type":"list", + "member":{"shape":"SimpleStruct"} + }, + "ListOfStrings":{ + "type":"list", + "member":{"shape":"String"} + }, + "ListOfEnums":{ + "type":"list", + "member":{"shape":"EnumType"} + }, + "Long":{"type":"long"}, + "MapOfStringToIntegerList":{ + "type":"map", + "key":{"shape":"String"}, + "value":{"shape":"ListOfIntegers"} + }, + "MapOfStringToListOfListOfStrings":{ + "type":"map", + "key":{"shape":"String"}, + "value":{"shape":"ListOfListOfStrings"} + }, + "MapOfStringToSimpleStruct":{ + "type":"map", + "key":{"shape":"String"}, + "value":{"shape":"SimpleStruct"} + }, + "MapOfStringToString":{ + "type":"map", + "key":{"shape":"String"}, + "value":{"shape":"String"} + }, + "MapOfEnumToEnum":{ + "type":"map", + "key":{"shape":"EnumType"}, + "value":{"shape":"EnumType"} + }, + "MapOfEnumToString":{ + "type":"map", + "key":{"shape":"EnumType"}, + "value":{"shape":"String"} + }, + "MapOfStringToEnum":{ + "type":"map", + "key":{"shape":"String"}, + "value":{"shape":"EnumType"} + }, + "MapOfEnumToSimpleStruct":{ + "type":"map", + "key":{"shape":"EnumType"}, + "value":{"shape":"SimpleStruct"} + }, + "NestedContainersStructure":{ + "type":"structure", + "members":{ + "ListOfListOfStrings":{"shape":"ListOfListOfStrings"}, + "ListOfListOfListOfStrings":{"shape":"ListOfListOfListOfStrings"}, + "MapOfStringToListOfListOfStrings":{"shape":"MapOfStringToListOfListOfStrings"} + } + }, + "RecursiveListType":{ + "type":"list", + "member":{"shape":"RecursiveStructType"} + }, + "RecursiveMapType":{ + "type":"map", + "key":{"shape":"String"}, + "value":{"shape":"RecursiveStructType"} + }, + "RecursiveStructType":{ + "type":"structure", + "members":{ + "NoRecurse":{"shape":"String"}, + "RecursiveStruct":{"shape":"RecursiveStructType"}, + "RecursiveList":{"shape":"RecursiveListType"}, + "RecursiveMap":{"shape":"RecursiveMapType"} + } + }, + "SimpleStruct":{ + "type":"structure", + "members":{ + "StringMember":{"shape":"String"} + } + }, + "StreamType":{ + "type":"blob", + "streaming":true + }, + "String":{"type":"string"}, + "StructWithNestedBlobType":{ + "type":"structure", + "members":{ + "NestedBlob":{"shape":"BlobType"} + } + }, + "StructWithTimestamp":{ + "type":"structure", + "members":{ + "NestedTimestamp":{"shape":"Timestamp"} + } + }, + "StructureWithStreamingMember":{ + "type":"structure", + "members":{ + "StreamingMember":{"shape":"StreamType"} + }, + "payload":"StreamingMember" + }, + "SubTypeOne":{ + "type":"structure", + "members":{ + "SubTypeOneMember":{"shape":"String"} + } + }, + "EnumType": { + "type":"string", + "enum": [ + "EnumValue1", "EnumValue2" + ] + }, + "Timestamp":{"type":"timestamp"} + } +} diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/streaminginputoperationrequestmarshaller.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/streaminginputoperationrequestmarshaller.java new file mode 100644 index 000000000000..81d2cf55bf5c --- /dev/null +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/streaminginputoperationrequestmarshaller.java @@ -0,0 +1,47 @@ +package software.amazon.awssdk.services.jsonprotocoltests.transform; + +import javax.annotation.Generated; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.core.Request; +import software.amazon.awssdk.core.exception.SdkClientException; +import software.amazon.awssdk.core.http.HttpMethodName; +import software.amazon.awssdk.core.protocol.OperationInfo; +import software.amazon.awssdk.core.protocol.Protocol; +import software.amazon.awssdk.core.protocol.ProtocolRequestMarshaller; +import software.amazon.awssdk.core.protocol.json.SdkJsonProtocolFactory; +import software.amazon.awssdk.core.runtime.transform.Marshaller; +import software.amazon.awssdk.services.jsonprotocoltests.model.StreamingInputOperationRequest; +import software.amazon.awssdk.utils.Validate; + +/** + * {@link StreamingInputOperationRequest} Marshaller + */ +@Generated("software.amazon.awssdk:codegen") +@SdkInternalApi +public class StreamingInputOperationRequestMarshaller implements + Marshaller, StreamingInputOperationRequest> { + private static final OperationInfo SDK_OPERATION_BINDING = OperationInfo.builder().protocol(Protocol.REST_JSON) + .requestUri("/2016-03-11/streamingInputOperation").httpMethodName(HttpMethodName.POST).hasExplicitPayloadMember(true) + .hasPayloadMembers(true).build(); + + private final SdkJsonProtocolFactory protocolFactory; + + public StreamingInputOperationRequestMarshaller(SdkJsonProtocolFactory protocolFactory) { + this.protocolFactory = protocolFactory; + } + + @Override + public Request marshall(StreamingInputOperationRequest streamingInputOperationRequest) { + Validate.paramNotNull(streamingInputOperationRequest, "streamingInputOperationRequest"); + try { + ProtocolRequestMarshaller protocolMarshaller = protocolFactory + .createProtocolMarshaller(SDK_OPERATION_BINDING, streamingInputOperationRequest); + protocolMarshaller.startMarshalling(); + StreamingInputOperationRequestModelMarshaller.getInstance().marshall(streamingInputOperationRequest, + protocolMarshaller); + return protocolMarshaller.finishMarshalling(); + } catch (Exception e) { + throw new SdkClientException("Unable to marshall request to JSON: " + e.getMessage(), e); + } + } +} diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/streaminginputoperationrequestmodelmarshaller.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/streaminginputoperationrequestmodelmarshaller.java new file mode 100644 index 000000000000..3426b83f4785 --- /dev/null +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/streaminginputoperationrequestmodelmarshaller.java @@ -0,0 +1,28 @@ +package software.amazon.awssdk.services.jsonprotocoltests.transform; + +import javax.annotation.Generated; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.core.protocol.ProtocolMarshaller; +import software.amazon.awssdk.services.jsonprotocoltests.model.StreamingInputOperationRequest; + +/** + * {@link StreamingInputOperationRequest} Marshaller + */ +@Generated("software.amazon.awssdk:codegen") +@SdkInternalApi +public class StreamingInputOperationRequestModelMarshaller { + private static final StreamingInputOperationRequestModelMarshaller INSTANCE = new StreamingInputOperationRequestModelMarshaller(); + + private StreamingInputOperationRequestModelMarshaller() { + } + + public static StreamingInputOperationRequestModelMarshaller getInstance() { + return INSTANCE; + } + + /** + * Marshall the given parameter object + */ + public void marshall(StreamingInputOperationRequest streamingInputOperationRequest, ProtocolMarshaller protocolMarshaller) { + } +} diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/streamingoutputoperationrequestmarshaller.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/streamingoutputoperationrequestmarshaller.java new file mode 100644 index 000000000000..62c0929ec4c7 --- /dev/null +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/streamingoutputoperationrequestmarshaller.java @@ -0,0 +1,47 @@ +package software.amazon.awssdk.services.jsonprotocoltests.transform; + +import javax.annotation.Generated; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.core.Request; +import software.amazon.awssdk.core.exception.SdkClientException; +import software.amazon.awssdk.core.http.HttpMethodName; +import software.amazon.awssdk.core.protocol.OperationInfo; +import software.amazon.awssdk.core.protocol.Protocol; +import software.amazon.awssdk.core.protocol.ProtocolRequestMarshaller; +import software.amazon.awssdk.core.protocol.json.SdkJsonProtocolFactory; +import software.amazon.awssdk.core.runtime.transform.Marshaller; +import software.amazon.awssdk.services.jsonprotocoltests.model.StreamingOutputOperationRequest; +import software.amazon.awssdk.utils.Validate; + +/** + * {@link StreamingOutputOperationRequest} Marshaller + */ +@Generated("software.amazon.awssdk:codegen") +@SdkInternalApi +public class StreamingOutputOperationRequestMarshaller implements + Marshaller, StreamingOutputOperationRequest> { + private static final OperationInfo SDK_OPERATION_BINDING = OperationInfo.builder().protocol(Protocol.REST_JSON) + .requestUri("/2016-03-11/streamingOutputOperation").httpMethodName(HttpMethodName.POST) + .hasExplicitPayloadMember(false).hasPayloadMembers(false).build(); + + private final SdkJsonProtocolFactory protocolFactory; + + public StreamingOutputOperationRequestMarshaller(SdkJsonProtocolFactory protocolFactory) { + this.protocolFactory = protocolFactory; + } + + @Override + public Request marshall(StreamingOutputOperationRequest streamingOutputOperationRequest) { + Validate.paramNotNull(streamingOutputOperationRequest, "streamingOutputOperationRequest"); + try { + ProtocolRequestMarshaller protocolMarshaller = protocolFactory + .createProtocolMarshaller(SDK_OPERATION_BINDING, streamingOutputOperationRequest); + protocolMarshaller.startMarshalling(); + StreamingOutputOperationRequestModelMarshaller.getInstance().marshall(streamingOutputOperationRequest, + protocolMarshaller); + return protocolMarshaller.finishMarshalling(); + } catch (Exception e) { + throw new SdkClientException("Unable to marshall request to JSON: " + e.getMessage(), e); + } + } +} diff --git a/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/streamingoutputoperationrequestmodelmarshaller.java b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/streamingoutputoperationrequestmodelmarshaller.java new file mode 100644 index 000000000000..06d1582c2544 --- /dev/null +++ b/codegen/src/test/resources/software/amazon/awssdk/codegen/poet/transform/streamingoutputoperationrequestmodelmarshaller.java @@ -0,0 +1,28 @@ +package software.amazon.awssdk.services.jsonprotocoltests.transform; + +import javax.annotation.Generated; +import software.amazon.awssdk.annotations.SdkInternalApi; +import software.amazon.awssdk.core.protocol.ProtocolMarshaller; +import software.amazon.awssdk.services.jsonprotocoltests.model.StreamingOutputOperationRequest; + +/** + * {@link StreamingOutputOperationRequest} Marshaller + */ +@Generated("software.amazon.awssdk:codegen") +@SdkInternalApi +public class StreamingOutputOperationRequestModelMarshaller { + private static final StreamingOutputOperationRequestModelMarshaller INSTANCE = new StreamingOutputOperationRequestModelMarshaller(); + + private StreamingOutputOperationRequestModelMarshaller() { + } + + public static StreamingOutputOperationRequestModelMarshaller getInstance() { + return INSTANCE; + } + + /** + * Marshall the given parameter object + */ + public void marshall(StreamingOutputOperationRequest streamingOutputOperationRequest, ProtocolMarshaller protocolMarshaller) { + } +} diff --git a/services/glacier/src/main/java/software/amazon/awssdk/services/glacier/transform/DefaultAccountIdSupplier.java b/services/glacier/src/main/java/software/amazon/awssdk/services/glacier/transform/DefaultAccountIdSupplier.java index 3bd8c2ddd300..82fc2b9c283c 100644 --- a/services/glacier/src/main/java/software/amazon/awssdk/services/glacier/transform/DefaultAccountIdSupplier.java +++ b/services/glacier/src/main/java/software/amazon/awssdk/services/glacier/transform/DefaultAccountIdSupplier.java @@ -16,9 +16,7 @@ package software.amazon.awssdk.services.glacier.transform; import java.util.function.Supplier; -import software.amazon.awssdk.annotations.ReviewBeforeRelease; -@ReviewBeforeRelease("If we refactor our marshallers, this should also be refactored to match.") public final class DefaultAccountIdSupplier { /** diff --git a/services/glacier/src/main/resources/codegen-resources/customization.config b/services/glacier/src/main/resources/codegen-resources/customization.config index e33ac046a81c..b9168b239b8a 100644 --- a/services/glacier/src/main/resources/codegen-resources/customization.config +++ b/services/glacier/src/main/resources/codegen-resources/customization.config @@ -32,5 +32,8 @@ } ] } + }, + "modelMarshallerDefaultValueSupplier": { + "AccountId" : "software.amazon.awssdk.services.glacier.transform.DefaultAccountIdSupplier.getInstance()" } } diff --git a/test/dynamodbmapper-v1/src/test/java/software/amazon/awssdk/services/dynamodb/datamodeling/PaginatedParallelScanList.java b/test/dynamodbmapper-v1/src/test/java/software/amazon/awssdk/services/dynamodb/datamodeling/PaginatedParallelScanList.java index 8517238f2da7..ad50b4bf7db6 100644 --- a/test/dynamodbmapper-v1/src/test/java/software/amazon/awssdk/services/dynamodb/datamodeling/PaginatedParallelScanList.java +++ b/test/dynamodbmapper-v1/src/test/java/software/amazon/awssdk/services/dynamodb/datamodeling/PaginatedParallelScanList.java @@ -55,7 +55,7 @@ public PaginatedParallelScanList( this.parallelScanTask = parallelScanTask; this.config = config; - // Marshal the first batch of results in allResults + // Marshall the first batch of results in all Results allResults.addAll(marshalParallelScanResponsesIntoObjects(parallelScanTask.nextBatchOfScanResponses())); // If the results should be eagerly loaded at once