A factory for instantiating types defined in the wsdl @ivar resolver: A schema type resolver. @type resolver: L{PathResolver} @ivar builder: A schema object builder. @type builder: L{Builder}
| 219 | |
| 220 | |
| 221 | class Factory: |
| 222 | """ |
| 223 | A factory for instantiating types defined in the wsdl |
| 224 | @ivar resolver: A schema type resolver. |
| 225 | @type resolver: L{PathResolver} |
| 226 | @ivar builder: A schema object builder. |
| 227 | @type builder: L{Builder} |
| 228 | """ |
| 229 | |
| 230 | def __init__(self, wsdl): |
| 231 | """ |
| 232 | @param wsdl: A schema object. |
| 233 | @type wsdl: L{wsdl.Definitions} |
| 234 | """ |
| 235 | self.wsdl = wsdl |
| 236 | self.resolver = PathResolver(wsdl) |
| 237 | self.builder = Builder(self.resolver) |
| 238 | |
| 239 | def create(self, name): |
| 240 | """ |
| 241 | create a WSDL type by name |
| 242 | @param name: The name of a type defined in the WSDL. |
| 243 | @type name: str |
| 244 | @return: The requested object. |
| 245 | @rtype: L{Object} |
| 246 | """ |
| 247 | timer = metrics.Timer() |
| 248 | timer.start() |
| 249 | type = self.resolver.find(name) |
| 250 | if type is None: |
| 251 | raise TypeNotFound(name) |
| 252 | if type.enum(): |
| 253 | result = InstFactory.object(name) |
| 254 | for e, a in type.children(): |
| 255 | setattr(result, e.name, e.name) |
| 256 | else: |
| 257 | try: |
| 258 | result = self.builder.build(type) |
| 259 | except Exception as e: |
| 260 | log.error("create '%s' failed", name, exc_info=True) |
| 261 | raise BuildError(name, e) |
| 262 | timer.stop() |
| 263 | metrics.log.debug('%s created: %s', name, timer) |
| 264 | return result |
| 265 | |
| 266 | def separator(self, ps): |
| 267 | """ |
| 268 | Set the path separator. |
| 269 | @param ps: The new path separator. |
| 270 | @type ps: char |
| 271 | """ |
| 272 | self.resolver = PathResolver(self.wsdl, ps) |
| 273 | |
| 274 | |
| 275 | class ServiceSelector: |