/// <summary> /// Generates the response unmarshaller along with any dependent structure unmarshallers that are called by this response unmarshaller. /// </summary> /// <param name="operation">The operation to generate the unmarshaller for</param> void GenerateResponseUnmarshaller(Operation operation) { { var generator = GetResponseUnmarshaller(); generator.Operation = operation; generator.IsWrapped = operation.IsResponseWrapped; generator.HasSuppressedResult = this.config.ServiceModel.Customizations.ResultGenerationSuppressions.Contains(operation.Name); var modifier = operation.model.Customizations.GetOperationModifiers(operation.Name); if (modifier != null) { // can use wrapped member to effect a rename, even though we don't push response // members down into a wrapped class generator.WrappedResultMember = modifier.WrappedResultMember; generator.IsWrapped = modifier.UseWrappingResult; } this.ExecuteGenerator(generator, operation.Name + "ResponseUnmarshaller.cs", "Model.Internal.MarshallTransformations"); // Add to the list of processed unmarshallers so we don't attempt to generate a generic structure unmarshaller. if (operation.ResponseStructure != null) { // Mark the shape as processed if it's being referred only as operation's // output shape and not being referred directly by any other shape or via an // operation modifier generating an artifical structure not in the service model. if (!IsShapeReferred(operation.ResponseStructure.Name, this.config.ServiceModel) && !operation.WrapsResultShape(operation.ResponseStructure.Name)) { this.processedUnmarshallers.Add(operation.ResponseStructure.Name); } } } if (operation.ResponseStructure != null) { var lookup = new NestedStructureLookup(); lookup.SearchForNestedStructures(operation.ResponseStructure); foreach (var nestedStructure in lookup.NestedStructures) { if (this.config.ServiceModel.Customizations.IsSubstitutedShape(nestedStructure.Name)) { continue; } // Skip already processed unmarshallers. This handles the case of structures being returned in mulitiple requests. if (!this.processedUnmarshallers.Contains(nestedStructure.Name)) { var generator = GetStructureUnmarshaller(); generator.Structure = nestedStructure; this.ExecuteGenerator(generator, nestedStructure.Name + "Unmarshaller.cs", "Model.Internal.MarshallTransformations"); this.processedUnmarshallers.Add(nestedStructure.Name); } else { //throw new Exception(); } } } }
/// <summary> /// Generates the response unmarshaller along with any dependent structure unmarshallers that are called by this response unmarshaller. /// </summary> /// <param name="operation">The operation to generate the unmarshaller for</param> void GenerateResponseUnmarshaller(Operation operation) { { var baseException = string.Format("Amazon{0}Exception", this.Configuration.IsChildConfig ? this.Configuration.ParentConfig.BaseName : this.Configuration.BaseName); var generator = GetResponseUnmarshaller(); generator.Operation = operation; generator.IsWrapped = operation.IsResponseWrapped; generator.HasSuppressedResult = this.Configuration.ServiceModel.Customizations.ResultGenerationSuppressions.Contains(operation.Name); generator.BaseException = baseException; var modifier = operation.model.Customizations.GetOperationModifiers(operation.Name); if (modifier != null) { // can use wrapped member to effect a rename, even though we don't push response // members down into a wrapped class generator.WrappedResultMember = modifier.WrappedResultMember; generator.IsWrapped = modifier.UseWrappingResult; } this.ExecuteGenerator(generator, operation.Name + "ResponseUnmarshaller.cs", "Model.Internal.MarshallTransformations"); // Add to the list of processed unmarshallers so we don't attempt to generate a generic structure unmarshaller. if (operation.ResponseStructure != null) { // Mark the shape as processed if it's being referred only as operation's // output shape and not being referred directly by any other shape or via an // operation modifier generating an artifical structure not in the service model. if (!IsShapeReferred(operation.ResponseStructure.Name, this.Configuration.ServiceModel) && !operation.WrapsResultShape(operation.ResponseStructure.Name)) this._processedUnmarshallers.Add(operation.ResponseStructure.Name); } } if (operation.ResponseStructure != null) { var lookup = new NestedStructureLookup(); lookup.SearchForNestedStructures(operation.ResponseStructure); foreach (var nestedStructure in lookup.NestedStructures) { // Skip structure unmarshallers that have already been generated for the parent model if (IsShapePresentInParentModel(this.Configuration, nestedStructure.Name)) continue; if (this.Configuration.ServiceModel.Customizations.IsSubstitutedShape(nestedStructure.Name)) continue; // Skip already processed unmarshallers. This handles the case of structures being returned in mulitiple requests. if (!this._processedUnmarshallers.Contains(nestedStructure.Name)) { var generator = GetStructureUnmarshaller(); generator.Structure = nestedStructure; this.ExecuteGenerator(generator, nestedStructure.Name + "Unmarshaller.cs", "Model.Internal.MarshallTransformations"); this._processedUnmarshallers.Add(nestedStructure.Name); } else { //throw new Exception(); } } } }
/// <summary> /// Generate the response class for the operation. /// </summary> /// <param name="operation">The operation object which contains info about what the response needs to contain for the operation</param> private void GenerateResponse(Operation operation) { var suppressResultGeneration = false; if (operation.UseWrappingResult) { // response members will be demoted to a structure contained by a // result container class (that is not in the service model) var className = operation.Name + "Result"; string propertyName = null; var propertyModifier = this.config.ServiceModel.Customizations.GetPropertyModifier(className, operation.ResponseStructure.Name); if (propertyModifier != null && propertyModifier.EmitName != null) { propertyName = propertyModifier.EmitName; } else { propertyName = operation.ResponseStructure.Name; } var resultGenerator = new WrappingResultGenerator { Operation = operation, ClassName = className, BaseClass = "AmazonWebServiceResponse", Structure = this.config.ServiceModel.FindShape(operation.ResponseStructure.Name), PropertyName = propertyName }; // emit the wrapping result but do not mark the shape as processed as a consequence this.ExecuteGenerator(resultGenerator, resultGenerator.ClassName + ".cs", "Model"); } else { // if the operation has a suppressed result modification, use the structure generator to emit // an empty xxxxResponse class, derived from AmazonWebServiceResponse suppressResultGeneration = this.config.ServiceModel.Customizations.ResultGenerationSuppressions.Contains(operation.Name); if (suppressResultGeneration) { var responseGenerator = new StructureGenerator { ClassName = operation.Name + "Response", BaseClass = "AmazonWebServiceResponse", Operation = operation }; this.ExecuteGenerator(responseGenerator, responseGenerator.ClassName + ".cs", "Model"); this.processedStructures.Add(operation.ResponseStructure.Name); } else { var resultGenerator = new StructureGenerator { ClassName = operation.Name + "Result", BaseClass = "AmazonWebServiceResponse", IsWrapped = operation.IsResponseWrapped }; if (operation.ResponseStructure != null) { if (operation.IsResponseWrapped) { // If IsResponseWrapped is true, the operation.ResponseStructure will point to a // the shape with same name as ResponseWrapper. var resultShape = this.config.ServiceModel.FindShape(operation.ResponseStructure.Name); var innerShape = resultShape.Members[0].Shape; resultGenerator.Structure = innerShape; } else { resultGenerator.Structure = this.config.ServiceModel.FindShape(operation.ResponseStructure.Name); } } this.ExecuteGenerator(resultGenerator, resultGenerator.ClassName + ".cs", "Model"); } } if (!suppressResultGeneration) { if (operation.ResponseStructure != null) { // Mark the shape as processed if it's being referred only as operation's // output shape and not being referred directly by any other shape or via an // operation modifier generating an artifical structure not in the service model. if (!IsShapeReferred(operation.ResponseStructure.Name, this.config.ServiceModel) && !operation.WrapsResultShape(operation.ResponseStructure.Name)) { this.processedStructures.Add(operation.ResponseStructure.Name); } } // This generates the legacy response class which just extends from the result class. var responseGenerator = new LegacyResponseClass() { OperationName = operation.Name }; this.ExecuteGenerator(responseGenerator, operation.Name + "Response.cs", "Model"); } }
/// <summary> /// Generate the response class for the operation. /// </summary> /// <param name="operation">The operation object which contains info about what the response needs to contain for the operation</param> private void GenerateResponse(Operation operation) { var suppressResultGeneration = false; if (operation.UseWrappingResult) { // response members will be demoted to a structure contained by a // result container class (that is not in the service model) var className = operation.Name + "Result"; string propertyName = null; var propertyModifier = this.config.ServiceModel.Customizations.GetPropertyModifier(className, operation.ResponseStructure.Name); if (propertyModifier != null && propertyModifier.EmitName != null) propertyName = propertyModifier.EmitName; else propertyName = operation.ResponseStructure.Name; var resultGenerator = new WrappingResultGenerator { Operation = operation, ClassName = className, BaseClass = "AmazonWebServiceResponse", Structure = this.config.ServiceModel.FindShape(operation.ResponseStructure.Name), PropertyName = propertyName }; // emit the wrapping result but do not mark the shape as processed as a consequence this.ExecuteGenerator(resultGenerator, resultGenerator.ClassName + ".cs", "Model"); } else { // if the operation has a suppressed result modification, use the structure generator to emit // an empty xxxxResponse class, derived from AmazonWebServiceResponse suppressResultGeneration = this.config.ServiceModel.Customizations.ResultGenerationSuppressions.Contains(operation.Name); if (suppressResultGeneration) { var responseGenerator = new StructureGenerator { ClassName = operation.Name + "Response", BaseClass = "AmazonWebServiceResponse", Operation = operation }; this.ExecuteGenerator(responseGenerator, responseGenerator.ClassName + ".cs", "Model"); this.processedStructures.Add(operation.ResponseStructure.Name); } else { var resultGenerator = new StructureGenerator { ClassName = operation.Name + "Result", BaseClass = "AmazonWebServiceResponse", IsWrapped = operation.IsResponseWrapped }; if (operation.ResponseStructure != null) { if (operation.IsResponseWrapped) { // If IsResponseWrapped is true, the operation.ResponseStructure will point to a // the shape with same name as ResponseWrapper. var resultShape = this.config.ServiceModel.FindShape(operation.ResponseStructure.Name); var innerShape = resultShape.Members[0].Shape; resultGenerator.Structure = innerShape; } else { resultGenerator.Structure = this.config.ServiceModel.FindShape(operation.ResponseStructure.Name); } } this.ExecuteGenerator(resultGenerator, resultGenerator.ClassName + ".cs", "Model"); } } if (!suppressResultGeneration) { if (operation.ResponseStructure != null) { // Mark the shape as processed if it's being referred only as operation's // output shape and not being referred directly by any other shape or via an // operation modifier generating an artifical structure not in the service model. if (!IsShapeReferred(operation.ResponseStructure.Name, this.config.ServiceModel) && !operation.WrapsResultShape(operation.ResponseStructure.Name)) this.processedStructures.Add(operation.ResponseStructure.Name); } // This generates the legacy response class which just extends from the result class. var responseGenerator = new LegacyResponseClass() { OperationName = operation.Name }; this.ExecuteGenerator(responseGenerator, operation.Name + "Response.cs", "Model"); } }