1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
###########################################################################
# Joshua R. Boverhof, LBNL
# See LBNLCopyright for copyright notice!
###########################################################################
import ZSI
from ZSI import TC, TCtimes, TCcompound
from ZSI.TC import TypeCode
from ZSI import _copyright, EvaluateException
from ZSI.wstools.Utility import SplitQName
from ZSI.wstools.Namespaces import SOAP, SCHEMA
###########################################################################
# Module Classes: BaseTypeInterpreter
###########################################################################
class NamespaceException(Exception): pass
class BaseTypeInterpreter:
"""Example mapping of xsd/soapenc types to zsi python types.
Checks against all available classes in ZSI.TC. Used in
wsdl2python, wsdlInterpreter, and ServiceProxy.
"""
def __init__(self):
self._type_list = [TC.Iinteger, TC.IunsignedShort, TC.gYearMonth, \
TC.InonNegativeInteger, TC.Iint, TC.String, \
TC.gDateTime, TC.IunsignedInt, TC.Duration,\
TC.IpositiveInteger, TC.FPfloat, TC.gDay, TC.gMonth, \
TC.InegativeInteger, TC.gDate, TC.URI, \
TC.HexBinaryString, TC.IunsignedByte, \
TC.gMonthDay, TC.InonPositiveInteger, \
TC.Ibyte, TC.FPdouble, TC.gTime, TC.gYear, \
TC.Ilong, TC.IunsignedLong, TC.Ishort, \
TC.Token, TC.QName]
self._tc_to_int = [
ZSI.TCnumbers.IEnumeration,
ZSI.TCnumbers.Iint,
ZSI.TCnumbers.Iinteger,
ZSI.TCnumbers.Ilong,
ZSI.TCnumbers.InegativeInteger,
ZSI.TCnumbers.InonNegativeInteger,
ZSI.TCnumbers.InonPositiveInteger,
ZSI.TC.Integer,
ZSI.TCnumbers.IpositiveInteger,
ZSI.TCnumbers.Ishort]
self._tc_to_float = [
ZSI.TC.Decimal,
ZSI.TCnumbers.FPEnumeration,
ZSI.TCnumbers.FPdouble,
ZSI.TCnumbers.FPfloat]
self._tc_to_string = [
ZSI.TC.Base64String,
ZSI.TC.Enumeration,
ZSI.TC.HexBinaryString,
ZSI.TCnumbers.Ibyte,
ZSI.TCnumbers.IunsignedByte,
ZSI.TCnumbers.IunsignedInt,
ZSI.TCnumbers.IunsignedLong,
ZSI.TCnumbers.IunsignedShort,
ZSI.TC.String,
ZSI.TC.URI,
ZSI.TC.XMLString,
ZSI.TC.Token]
self._tc_to_tuple = [
ZSI.TC.Duration,
ZSI.TC.QName,
ZSI.TCtimes.gDate,
ZSI.TCtimes.gDateTime,
ZSI.TCtimes.gDay,
ZSI.TCtimes.gMonthDay,
ZSI.TCtimes.gTime,
ZSI.TCtimes.gYear,
ZSI.TCtimes.gMonth,
ZSI.TCtimes.gYearMonth]
return
def _get_xsd_typecode(self, msg_type):
untaged_xsd_types = {'boolean':TC.Boolean,
'decimal':TC.Decimal,
'base64Binary':TC.Base64String}
if untaged_xsd_types.has_key(msg_type):
return untaged_xsd_types[msg_type]
for tc in self._type_list:
if tc.type == (SCHEMA.XSD3,msg_type):
break
else:
tc = TC.AnyType
return tc
def _get_soapenc_typecode(self, msg_type):
if msg_type == 'Array':
return TCcompound.Array
if msg_type == 'Struct':
return TCcompound.Struct
return self._get_xsd_typecode(msg_type)
def get_typeclass(self, msg_type, targetNamespace):
prefix, name = SplitQName(msg_type)
if targetNamespace in SCHEMA.XSD_LIST:
return self._get_xsd_typecode(name)
elif targetNamespace in [SOAP.ENC]:
return self._get_soapenc_typecode(name)
return None
def get_pythontype(self, msg_type, targetNamespace, typeclass=None):
if not typeclass:
tc = self.get_typeclass(msg_type, targetNamespace)
else:
tc = typeclass
if tc in self._tc_to_int:
return 'int'
elif tc in self._tc_to_float:
return 'float'
elif tc in self._tc_to_string:
return 'str'
elif tc in self._tc_to_tuple:
return 'tuple'
elif tc in [TCcompound.Array]:
return 'list'
elif tc in [TC.Boolean]:
return 'bool'
elif isinstance(tc, TypeCode):
raise EvaluateException,\
'failed to map zsi typecode to a python type'
return None
|