|
|
@@ -0,0 +1,77 @@
|
|
|
+# Copyright 2012-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
|
+#
|
|
|
+# Modifications made by Cloudera are:
|
|
|
+# Copyright (c) 2016 Cloudera, Inc. 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.
|
|
|
+
|
|
|
+from collections import OrderedDict
|
|
|
+import json
|
|
|
+
|
|
|
+
|
|
|
+class Serializer(object):
|
|
|
+ DEFAULT_ENCODING = 'utf-8'
|
|
|
+
|
|
|
+ def serialize_to_request(self, parameters, operation_model):
|
|
|
+ # Don't serialize any parameter with a None value.
|
|
|
+ filtered_parameters = OrderedDict(
|
|
|
+ (k, v) for k, v in parameters.items() if v is not None)
|
|
|
+
|
|
|
+ serialized = {}
|
|
|
+ # serialized['method'] = operation_model.http['method']
|
|
|
+ # serialized['headers'] = {'Content-Type': 'application/json'}
|
|
|
+ # serialized['url_path'] = operation_model.http['requestUri']
|
|
|
+
|
|
|
+ serialized_body = OrderedDict()
|
|
|
+ if len(filtered_parameters) != 0:
|
|
|
+ self._serialize(serialized_body, filtered_parameters, None)
|
|
|
+
|
|
|
+ serialized['body'] = json.dumps(serialized_body).encode(self.DEFAULT_ENCODING)
|
|
|
+
|
|
|
+ return serialized
|
|
|
+
|
|
|
+ def _serialize(self, serialized, value, shape, key=None):
|
|
|
+ # serialize_method_name = '_serialize_type_%s' % shape.type_name
|
|
|
+ # method = getattr(self, serialize_method_name, self._default_serialize)
|
|
|
+ self._default_serialize(serialized, value, shape, key)
|
|
|
+
|
|
|
+ def _serialize_type_object(self, serialized, value, shape, key):
|
|
|
+ if key is not None:
|
|
|
+ # If a key is provided, this is a result of a recursive call, so we
|
|
|
+ # need to add a new child dict as the value of the passed in dict.
|
|
|
+ # Below we will add all the structure members to the new serialized
|
|
|
+ # dictionary we just created.
|
|
|
+ serialized[key] = OrderedDict()
|
|
|
+ serialized = serialized[key]
|
|
|
+
|
|
|
+ for member_key, member_value in value.items():
|
|
|
+ member_shape = shape.members[member_key]
|
|
|
+ self._serialize(serialized, member_value, member_shape, member_key)
|
|
|
+
|
|
|
+ def _serialize_type_array(self, serialized, value, shape, key):
|
|
|
+ array_obj = []
|
|
|
+ serialized[key] = array_obj
|
|
|
+ for array_item in value:
|
|
|
+ wrapper = {}
|
|
|
+ # JSON list serialization is the only case where we aren't setting
|
|
|
+ # a key on a dict. We handle this by using a __current__ key on a
|
|
|
+ # wrapper dict to serialize each list item before appending it to
|
|
|
+ # the serialized list.
|
|
|
+ self._serialize(wrapper, array_item, shape.member, "__current__")
|
|
|
+ array_obj.append(wrapper["__current__"])
|
|
|
+
|
|
|
+ def _default_serialize(self, serialized, value, shape, key):
|
|
|
+ if key:
|
|
|
+ serialized[key] = value
|
|
|
+ else:
|
|
|
+ for member_key, member_value in value.items():
|
|
|
+ serialized[member_key] = member_value
|