← Back to team overview

ladon-dev-team team mailing list archive

[Merge] lp:~j-launchpad-dennis/ladon/ladon into lp:ladon

 

Dennis Plöger has proposed merging lp:~j-launchpad-dennis/ladon/ladon into lp:ladon.

Requested reviews:
  Ladon Developer (ladon-dev-team)
Related bugs:
  Bug #1131214 in ladon: "XMLRPC support"
  https://bugs.launchpad.net/ladon/+bug/1131214
  Bug #1149525 in ladon: "XMLRPC-interface faults when requesting a method, that responses with a non-string"
  https://bugs.launchpad.net/ladon/+bug/1149525

For more details, see:
https://code.launchpad.net/~j-launchpad-dennis/ladon/ladon/+merge/151956

Fixes Bug #1149525
-- 
https://code.launchpad.net/~j-launchpad-dennis/ladon/ladon/+merge/151956
Your team Ladon Developer is requested to review the proposed merge of lp:~j-launchpad-dennis/ladon/ladon into lp:ladon.
=== modified file 'frameworks/python/src/ladon/interfaces/xmlrpc.py'
--- frameworks/python/src/ladon/interfaces/xmlrpc.py	2013-03-03 21:17:57 +0000
+++ frameworks/python/src/ladon/interfaces/xmlrpc.py	2013-03-06 13:36:38 +0000
@@ -58,7 +58,8 @@
     _content_type = 'text/xml'
     _special_types = []
 
-    def _get_type_name(self, type_class):
+    @staticmethod
+    def get_type_name(type_class):
 
         try:
 
@@ -68,7 +69,8 @@
 
             return type(type_class).__name__
 
-    def _type_to_xmlrpc(self, type_name):
+    @staticmethod
+    def type_to_xmlrpc(type_name):
 
         if type_name in ['str', 'unicode']:
 
@@ -84,7 +86,7 @@
 
         elif type_name == 'datetime.time':
 
-            return 'dateTime8601'
+            return 'dateTime.iso8601'
 
         elif type_name == 'bool':
 
@@ -122,7 +124,7 @@
 
         for type_class in type_dict:
 
-            self._special_types.append(self._get_type_name(type_class))
+            self._special_types.append(get_type_name(type_class))
 
         impl = getDOMImplementation()
 
@@ -160,8 +162,8 @@
 
                 member_el.setAttribute(
                     'type',
-                    self._type_to_xmlrpc(
-                        self._get_type_name(member_type)
+                    type_to_xmlrpc(
+                        get_type_name(member_type)
                     )
                 )
 
@@ -188,8 +190,8 @@
             method_el.setAttribute('name', method.name())
             method_el.setAttribute(
                 'result',
-                self._type_to_xmlrpc(
-                    self._get_type_name(method_info['rtype'][0])
+                type_to_xmlrpc(
+                    get_type_name(method_info['rtype'][0])
                 )
             )
 
@@ -199,8 +201,8 @@
 
                 param_el.setAttribute(
                     'type',
-                    self._type_to_xmlrpc(
-                        self._get_type_name(param['type'])
+                    type_to_xmlrpc(
+                        get_type_name(param['type'])
                     )
                 )
 
@@ -346,65 +348,65 @@
 
         value_el = resp_doc.createElement('value')
 
-        if isinstance(value, (str, unicode)):
-
-            # Check for special cases base64, dateTime.iso8601
-
-            if is_binary(value):
-
-                base64_el = resp_doc.createElement('base64')
-                base64_el.appendChild(
-                    resp_doc.createTextNode(base64.b64encode(str(value)))
-                )
-
-                value_el.appendChild(base64_el)
-
-            elif self.datetime_re.match(value):
-
-                datetime_el = resp_doc.createElement('dateTime.iso8601')
-                datetime_el.appendChild(
-                    resp_doc.createTextNode(value)
-                )
-
-                value_el.appendChild(datetime_el)
-
-            elif isinstance(value, unicode):
-
-                string_el = resp_doc.createElement('string')
-                string_el.appendChild(
-                    resp_doc.createTextNode(value)
-                )
-
-                value_el.appendChild(string_el)
-
-            else:
-
-                string_el = resp_doc.createElement('string')
-                string_el.appendChild(
-                    resp_doc.createTextNode(u(value))
-                )
-
-                value_el.appendChild(string_el)
-
-        elif isinstance(value, int):
+        type = XMLRPCServiceDescriptor.type_to_xmlrpc(XMLRPCServiceDescriptor.get_type_name(value))
+
+        if type == 'base64':
+
+            base64_el = resp_doc.createElement('base64')
+            base64_el.appendChild(
+                resp_doc.createTextNode(base64.b64encode(str(value)))
+            )
+
+            value_el.appendChild(base64_el)
+
+        elif type == 'string' and self.datetime_re.match(value):
+
+            # Special case of a string, that is in dateTime.iso8601 format
+
+            datetime_el = resp_doc.createElement('dateTime.iso8601')
+            datetime_el.appendChild(
+                resp_doc.createTextNode(value)
+            )
+
+            value_el.appendChild(datetime_el)
+
+        elif type == 'string' and XMLRPCServiceDescriptor.get_type_name(value) == 'unicode':
+
+            string_el = resp_doc.createElement('string')
+            string_el.appendChild(
+                resp_doc.createTextNode(value)
+            )
+
+            value_el.appendChild(string_el)
+
+        elif type == 'string':
+
+            string_el = resp_doc.createElement('string')
+            string_el.appendChild(
+                resp_doc.createTextNode(u(value))
+            )
+
+            value_el.appendChild(string_el)
+
+        elif type == 'int':
 
             int_el = resp_doc.createElement('int')
             int_el.appendChild(
-                resp_doc.createTextNode(value)
+                resp_doc.createTextNode(u(str(value)))
             )
 
             value_el.appendChild(int_el)
 
-        elif isinstance(value, float):
+        elif type == 'double':
 
             double_el = resp_doc.createElement('double')
             double_el.appendChild(
-                resp_doc.createTextNode(value)
+                resp_doc.createTextNode(u(str(value)))
             )
 
             value_el.appendChild(double_el)
 
-        elif isinstance(value, bool):
+        elif type == 'boolean':
 
             if value:
                 value = 1
@@ -413,12 +415,12 @@
 
             boolean_el = resp_doc.createElement('boolean')
             boolean_el.appendChild(
-                resp_doc.createTextNode(value)
+                resp_doc.createTextNode(u(str(value)))
             )
 
             value_el.appendChild(boolean_el)
 
-        elif isinstance(value, datetime.time):
+        elif type == 'dateTime.iso8601':
 
             datetime_el = resp_doc.createElement('dateTime.iso8601')
             datetime_el.appendChild(
@@ -429,7 +431,7 @@
 
             value_el.appendChild(datetime_el)
 
-        elif isinstance(value, dict):
+        elif type == 'struct':
 
             struct_el = resp_doc.createElement('struct')
 
@@ -456,7 +458,7 @@
 
             value_el.appendChild(struct_el)
 
-        elif isinstance(value, list):
+        elif type == 'array':
 
             array_el = resp_doc.createElement('array')
             data_el = resp_doc.createElement('data')


Follow ups