1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 """
18 The plugin module provides classes for implementation
19 of suds plugins.
20 """
21
22 from suds import *
23 from logging import getLogger
24
25 log = getLogger(__name__)
26
27
28 -class Context(object):
29 """
30 Plugin context.
31 """
32 pass
33
34
35 -class InitContext(Context):
36 """
37 Init Context.
38 @ivar wsdl: The wsdl.
39 @type wsdl: L{wsdl.Definitions}
40 """
41 pass
42
43
44 -class DocumentContext(Context):
45 """
46 The XML document load context.
47 @ivar url: The URL.
48 @type url: str
49 @ivar document: Either the XML text or the B{parsed} document root.
50 @type document: (str|L{sax.element.Element})
51 """
52 pass
53
54
55 -class MessageContext(Context):
56 """
57 The context for sending the soap envelope.
58 @ivar envelope: The soap envelope to be sent.
59 @type envelope: (str|L{sax.element.Element})
60 @ivar reply: The reply.
61 @type reply: (str|L{sax.element.Element}|object)
62 """
63 pass
64
65
67 """
68 Plugin base.
69 """
70 pass
71
72
74 """
75 The base class for suds I{init} plugins.
76 """
77
79 """
80 Suds client initialization.
81 Called after wsdl the has been loaded. Provides the plugin
82 with the opportunity to inspect/modify the WSDL.
83 @param context: The init context.
84 @type context: L{InitContext}
85 """
86 pass
87
88
90 """
91 The base class for suds I{document} plugins.
92 """
93
95 """
96 Suds has loaded a WSDL/XSD document. Provides the plugin
97 with an opportunity to inspect/modify the unparsed document.
98 Called after each WSDL/XSD document is loaded.
99 @param context: The document context.
100 @type context: L{DocumentContext}
101 """
102 pass
103
105 """
106 Suds has parsed a WSDL/XSD document. Provides the plugin
107 with an opportunity to inspect/modify the parsed document.
108 Called after each WSDL/XSD document is parsed.
109 @param context: The document context.
110 @type context: L{DocumentContext}
111 """
112 pass
113
114
116 """
117 The base class for suds I{soap message} plugins.
118 """
119
121 """
122 Suds will send the specified soap envelope.
123 Provides the plugin with the opportunity to inspect/modify
124 the envelope Document before it is sent.
125 @param context: The send context.
126 The I{envelope} is the envelope docuemnt.
127 @type context: L{MessageContext}
128 """
129 pass
130
132 """
133 Suds will send the specified soap envelope.
134 Provides the plugin with the opportunity to inspect/modify
135 the message text it is sent.
136 @param context: The send context.
137 The I{envelope} is the envelope text.
138 @type context: L{MessageContext}
139 """
140 pass
141
143 """
144 Suds has received the specified reply.
145 Provides the plugin with the opportunity to inspect/modify
146 the received XML text before it is SAX parsed.
147 @param context: The reply context.
148 The I{reply} is the raw text.
149 @type context: L{MessageContext}
150 """
151 pass
152
154 """
155 Suds has sax parsed the received reply.
156 Provides the plugin with the opportunity to inspect/modify
157 the sax parsed DOM tree for the reply before it is unmarshalled.
158 @param context: The reply context.
159 The I{reply} is DOM tree.
160 @type context: L{MessageContext}
161 """
162 pass
163
165 """
166 Suds has unmarshalled the received reply.
167 Provides the plugin with the opportunity to inspect/modify
168 the unmarshalled reply object before it is returned.
169 @param context: The reply context.
170 The I{reply} is unmarshalled suds object.
171 @type context: L{MessageContext}
172 """
173 pass
174
175
177 """
178 Plugin container provides easy method invocation.
179 @ivar plugins: A list of plugin objects.
180 @type plugins: [L{Plugin},]
181 @cvar ctxclass: A dict of plugin method / context classes.
182 @type ctxclass: dict
183 """
184
185 domains = {\
186 'init': (InitContext, InitPlugin),
187 'document': (DocumentContext, DocumentPlugin),
188 'message': (MessageContext, MessagePlugin ),
189 }
190
192 """
193 @param plugins: A list of plugin objects.
194 @type plugins: [L{Plugin},]
195 """
196 self.plugins = plugins
197
199 domain = self.domains.get(name)
200 if domain:
201 plugins = []
202 ctx, pclass = domain
203 for p in self.plugins:
204 if isinstance(p, pclass):
205 plugins.append(p)
206 return PluginDomain(ctx, plugins)
207 else:
208 raise Exception, 'plugin domain (%s), invalid' % name
209
210
212 """
213 The plugin domain.
214 @ivar ctx: A context.
215 @type ctx: L{Context}
216 @ivar plugins: A list of plugins (targets).
217 @type plugins: list
218 """
219
220 - def __init__(self, ctx, plugins):
221 self.ctx = ctx
222 self.plugins = plugins
223
224 - def __getattr__(self, name):
225 return Method(name, self)
226
227
229 """
230 Plugin method.
231 @ivar name: The method name.
232 @type name: str
233 @ivar domain: The plugin domain.
234 @type domain: L{PluginDomain}
235 """
236
238 """
239 @param name: The method name.
240 @type name: str
241 @param domain: A plugin domain.
242 @type domain: L{PluginDomain}
243 """
244 self.name = name
245 self.domain = domain
246
248 ctx = self.domain.ctx()
249 ctx.__dict__.update(kwargs)
250 for plugin in self.domain.plugins:
251 try:
252 method = getattr(plugin, self.name, None)
253 if method and callable(method):
254 method(ctx)
255 except Exception, pe:
256 log.exception(pe)
257 return ctx
258