code: private static String getResultShapeName(Operation operation, Map<String, Shape> shapes) {
          Output output = operation.getOutput();
          if (output == null) return null;
          Shape outputShape = shapes.get(output.getShape());
          if (outputShape.getMembers().keySet().size() != 1) return output.getShape();
          Member wrappedMember = outputShape.getMembers().values().toArray(new Member[0])[0];
          Shape wrappedResult = shapes.get(wrappedMember.getShape());
          return wrappedResult != null && wrappedResult.isWrapper() ? wrappedMember.getShape() : output.getShape();
      }
docs: In query protocol, the wrapped result is the real return type for the given operation. In the c2j model,
  if the output shape has only one member, and the member shape is wrapped (wrapper is true), then the
  return type is the wrapped member shape instead of the output shape. In the following example, the service API is:
  
  public Foo operation(OperationRequest operationRequest);
  
  And the wire log is:
  <OperationResponse>
  <OperationResult>
  <Foo>
  ...
  </Foo>
  </OperationResult>
  <OperationMetadata>
  </OperationMetadata>
  </OperationResponse>
  
  The C2j model is:
  "Operation": {
  "input": {"shape": "OperationRequest"},
  "output": {
  "shape": "OperationResult",
  "resultWrapper": "OperationResult"
  }
  },
  "OperationResult": {
  ...
  "members": {
  "Foo": {"shape": "Foo"}
  }
  },
  "Foo" : {
  ...
  "wrapper" : true
  }
  
  Return the wrapped shape name from the given operation if it conforms to the condition
  described above, otherwise, simply return the direct output shape name.