|
|
@@ -266,6 +266,7 @@ class DOMAdapter(DOMAdapterInterface): |
|
|
|
class XMLBase: |
|
|
|
""" These class variables are for string indentation. |
|
|
|
""" |
|
|
|
tag = None |
|
|
|
__indent = 0 |
|
|
|
__rlock = RLock() |
|
|
|
|
|
|
@@ -431,6 +432,27 @@ class XMLSchemaComponent(XMLBase, MarkerInterface): |
|
|
|
and type(self.__class__.contents) == type(XMLSchemaComponent.contents)): |
|
|
|
raise RuntimeError, 'Bad type for a class variable in %s' %self.__class__ |
|
|
|
|
|
|
|
def getItemTrace(self): |
|
|
|
"""Returns a node trace up to the <schema> item. |
|
|
|
""" |
|
|
|
item, path, name, ref = self, [], 'name', 'ref' |
|
|
|
while isinstance(item, XMLSchema) is False: |
|
|
|
attr = item.getAttribute(name) |
|
|
|
if attr is None: |
|
|
|
attr = item.getAttribute(ref) |
|
|
|
if attr is None: path.append('<%s>' %(item.tag)) |
|
|
|
else: path.append('<%s ref="%s">' %(item.tag, attr)) |
|
|
|
else: |
|
|
|
path.append('<%s name="%s">' %(item.tag,attr)) |
|
|
|
item = item._parent() |
|
|
|
try: |
|
|
|
tns = item.getTargetNamespace() |
|
|
|
except: |
|
|
|
tns = '' |
|
|
|
path.append('<%s targetNamespace="%s">' %(item.tag, tns)) |
|
|
|
path.reverse() |
|
|
|
return ''.join(path) |
|
|
|
|
|
|
|
def getTargetNamespace(self): |
|
|
|
"""return targetNamespace |
|
|
|
""" |
|
|
@@ -597,6 +619,7 @@ class WSDLToolsAdapter(XMLSchemaComponent): |
|
|
|
"""WSDL Adapter to grab the attributes from the wsdl document node. |
|
|
|
""" |
|
|
|
attributes = {'name':None, 'targetNamespace':None} |
|
|
|
tag = 'definitions' |
|
|
|
|
|
|
|
def __init__(self, wsdl): |
|
|
|
#XMLSchemaComponent.__init__(self, None) |
|
|
@@ -624,6 +647,7 @@ class Notation(XMLSchemaComponent): |
|
|
|
required = ['name', 'public'] |
|
|
|
attributes = {'id':None, 'name':None, 'public':None, 'system':None} |
|
|
|
contents = {'xsd':('annotation')} |
|
|
|
tag = 'notation' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -656,6 +680,7 @@ class Annotation(XMLSchemaComponent): |
|
|
|
""" |
|
|
|
attributes = {'id':None} |
|
|
|
contents = {'xsd':('documentation', 'appinfo')} |
|
|
|
tag = 'annotation' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -691,6 +716,7 @@ class Annotation(XMLSchemaComponent): |
|
|
|
""" |
|
|
|
attributes = {'source':None, 'xml:lang':None} |
|
|
|
contents = {'xsd':('mixed', 'any')} |
|
|
|
tag = 'documentation' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -725,6 +751,7 @@ class Annotation(XMLSchemaComponent): |
|
|
|
""" |
|
|
|
attributes = {'source':None, 'anyURI':None} |
|
|
|
contents = {'xsd':('mixed', 'any')} |
|
|
|
tag = 'appinfo' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -804,6 +831,7 @@ class XMLSchema(XMLSchemaComponent): |
|
|
|
'attributeGroup', 'complexType', 'element', 'group',\ |
|
|
|
'notation', 'simpleType', 'annotation')} |
|
|
|
empty_namespace = '' |
|
|
|
tag = 'schema' |
|
|
|
|
|
|
|
def __init__(self, parent=None): |
|
|
|
"""parent -- |
|
|
@@ -1066,6 +1094,7 @@ class XMLSchema(XMLSchemaComponent): |
|
|
|
'namespace':None, |
|
|
|
'schemaLocation':None} |
|
|
|
contents = {'xsd':['annotation']} |
|
|
|
tag = 'import' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -1123,6 +1152,7 @@ class XMLSchema(XMLSchemaComponent): |
|
|
|
attributes = {'id':None, |
|
|
|
'schemaLocation':None} |
|
|
|
contents = {'xsd':['annotation']} |
|
|
|
tag = 'include' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -1147,10 +1177,7 @@ class XMLSchema(XMLSchemaComponent): |
|
|
|
and create a new Schema class instance. |
|
|
|
""" |
|
|
|
if not self._schema: |
|
|
|
#schema = self._parent()._parent() |
|
|
|
schema = self._parent() |
|
|
|
#self._schema = schema.getIncludeSchemas(\ |
|
|
|
# self.attributes['schemaLocation']) |
|
|
|
self._schema = schema.getIncludeSchemas().get(\ |
|
|
|
self.attributes['schemaLocation'] |
|
|
|
) |
|
|
@@ -1185,6 +1212,7 @@ class AttributeDeclaration(XMLSchemaComponent,\ |
|
|
|
'default':None, |
|
|
|
'fixed':None} |
|
|
|
contents = {'xsd':['annotation','simpleType']} |
|
|
|
tag = 'attribute' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -1277,6 +1305,7 @@ class AttributeWildCard(XMLSchemaComponent,\ |
|
|
|
'namespace':'##any', |
|
|
|
'processContents':'strict'} |
|
|
|
contents = {'xsd':['annotation']} |
|
|
|
tag = 'anyAttribute' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -1317,6 +1346,7 @@ class AttributeReference(XMLSchemaComponent,\ |
|
|
|
'default':None, |
|
|
|
'fixed':None} |
|
|
|
contents = {'xsd':['annotation']} |
|
|
|
tag = 'attribute' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -1351,6 +1381,7 @@ class AttributeGroupDefinition(XMLSchemaComponent,\ |
|
|
|
attributes = {'id':None, |
|
|
|
'name':None} |
|
|
|
contents = {'xsd':['annotation']} |
|
|
|
tag = 'attributeGroup' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -1405,6 +1436,7 @@ class AttributeGroupReference(XMLSchemaComponent,\ |
|
|
|
attributes = {'id':None, |
|
|
|
'ref':None} |
|
|
|
contents = {'xsd':['annotation']} |
|
|
|
tag = 'attributeGroup' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -1501,6 +1533,7 @@ class IdentityConstrants(XMLSchemaComponent): |
|
|
|
attributes = {'id':None, |
|
|
|
'xpath':None} |
|
|
|
contents = {'xsd':['annotation']} |
|
|
|
tag = 'selector' |
|
|
|
|
|
|
|
class Field(Constraint): |
|
|
|
"""<field xpath> |
|
|
@@ -1516,6 +1549,7 @@ class IdentityConstrants(XMLSchemaComponent): |
|
|
|
attributes = {'id':None, |
|
|
|
'xpath':None} |
|
|
|
contents = {'xsd':['annotation']} |
|
|
|
tag = 'field' |
|
|
|
|
|
|
|
|
|
|
|
class Unique(IdentityConstrants): |
|
|
@@ -1533,6 +1567,7 @@ class Unique(IdentityConstrants): |
|
|
|
attributes = {'id':None, |
|
|
|
'name':None} |
|
|
|
contents = {'xsd':['annotation', 'selector', 'field']} |
|
|
|
tag = 'unique' |
|
|
|
|
|
|
|
|
|
|
|
class Key(IdentityConstrants): |
|
|
@@ -1552,6 +1587,7 @@ class Key(IdentityConstrants): |
|
|
|
attributes = {'id':None, |
|
|
|
'name':None} |
|
|
|
contents = {'xsd':['annotation', 'selector', 'field']} |
|
|
|
tag = 'key' |
|
|
|
|
|
|
|
|
|
|
|
class KeyRef(IdentityConstrants): |
|
|
@@ -1571,6 +1607,7 @@ class KeyRef(IdentityConstrants): |
|
|
|
'name':None, |
|
|
|
'refer':None} |
|
|
|
contents = {'xsd':['annotation', 'selector', 'field']} |
|
|
|
tag = 'keyref' |
|
|
|
|
|
|
|
|
|
|
|
class ElementDeclaration(XMLSchemaComponent,\ |
|
|
@@ -1609,6 +1646,7 @@ class ElementDeclaration(XMLSchemaComponent,\ |
|
|
|
'final':lambda self: self._parent().getFinalDefault()} |
|
|
|
contents = {'xsd':['annotation', 'simpleType', 'complexType', 'key',\ |
|
|
|
'keyref', 'unique']} |
|
|
|
tag = 'element' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -1704,6 +1742,7 @@ class ElementReference(XMLSchemaComponent,\ |
|
|
|
'minOccurs':'1', |
|
|
|
'maxOccurs':'1'} |
|
|
|
contents = {'xsd':['annotation']} |
|
|
|
tag = 'element' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -1744,6 +1783,7 @@ class ElementWildCard(LocalElementDeclaration,\ |
|
|
|
'namespace':'##any', |
|
|
|
'processContents':'strict'} |
|
|
|
contents = {'xsd':['annotation']} |
|
|
|
tag = 'any' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -1783,6 +1823,7 @@ class Sequence(XMLSchemaComponent,\ |
|
|
|
'maxOccurs':'1'} |
|
|
|
contents = {'xsd':['annotation', 'element', 'group', 'choice', 'sequence',\ |
|
|
|
'any']} |
|
|
|
tag = 'sequence' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -1839,6 +1880,7 @@ class All(XMLSchemaComponent,\ |
|
|
|
'minOccurs':'1', |
|
|
|
'maxOccurs':'1'} |
|
|
|
contents = {'xsd':['annotation', 'element']} |
|
|
|
tag = 'all' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -1888,6 +1930,7 @@ class Choice(XMLSchemaComponent,\ |
|
|
|
'maxOccurs':'1'} |
|
|
|
contents = {'xsd':['annotation', 'element', 'group', 'choice', 'sequence',\ |
|
|
|
'any']} |
|
|
|
tag = 'choice' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -1944,6 +1987,7 @@ class ModelGroupDefinition(XMLSchemaComponent,\ |
|
|
|
attributes = {'id':None, |
|
|
|
'name':None} |
|
|
|
contents = {'xsd':['annotation', 'all', 'choice', 'sequence']} |
|
|
|
tag = 'group' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -1995,6 +2039,7 @@ class ModelGroupReference(XMLSchemaComponent,\ |
|
|
|
'minOccurs':'1', |
|
|
|
'maxOccurs':'1'} |
|
|
|
contents = {'xsd':['annotation']} |
|
|
|
tag = 'group' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -2045,6 +2090,7 @@ class ComplexType(XMLSchemaComponent,\ |
|
|
|
contents = {'xsd':['annotation', 'simpleContent', 'complexContent',\ |
|
|
|
'group', 'all', 'choice', 'sequence', 'attribute', 'attributeGroup',\ |
|
|
|
'anyAttribute', 'any']} |
|
|
|
tag = 'complexType' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -2151,6 +2197,7 @@ class ComplexType(XMLSchemaComponent,\ |
|
|
|
attributes = {'id':None, |
|
|
|
'mixed':0 } |
|
|
|
contents = {'xsd':['annotation', 'restriction', 'extension']} |
|
|
|
tag = 'complexContent' |
|
|
|
|
|
|
|
class _DerivationBase(XMLSchemaComponent): |
|
|
|
"""<extension>,<restriction> |
|
|
@@ -2247,7 +2294,7 @@ class ComplexType(XMLSchemaComponent,\ |
|
|
|
annotation?, (group | all | choice | sequence)?, |
|
|
|
(attribute | attributeGroup)*, anyAttribute? |
|
|
|
""" |
|
|
|
pass |
|
|
|
tag = 'extension' |
|
|
|
|
|
|
|
class Restriction(_DerivationBase,\ |
|
|
|
RestrictionMarker): |
|
|
@@ -2262,7 +2309,7 @@ class ComplexType(XMLSchemaComponent,\ |
|
|
|
annotation?, (group | all | choice | sequence)?, |
|
|
|
(attribute | attributeGroup)*, anyAttribute? |
|
|
|
""" |
|
|
|
pass |
|
|
|
tag = 'restriction' |
|
|
|
|
|
|
|
|
|
|
|
class SimpleContent(_DerivedType,\ |
|
|
@@ -2278,6 +2325,7 @@ class ComplexType(XMLSchemaComponent,\ |
|
|
|
""" |
|
|
|
attributes = {'id':None} |
|
|
|
contents = {'xsd':['annotation', 'restriction', 'extension']} |
|
|
|
tag = 'simpleContent' |
|
|
|
|
|
|
|
class Extension(XMLSchemaComponent,\ |
|
|
|
ExtensionMarker): |
|
|
@@ -2296,6 +2344,7 @@ class ComplexType(XMLSchemaComponent,\ |
|
|
|
'base':None } |
|
|
|
contents = {'xsd':['annotation', 'attribute', 'attributeGroup', |
|
|
|
'anyAttribute']} |
|
|
|
tag = 'extension' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -2359,6 +2408,7 @@ class ComplexType(XMLSchemaComponent,\ |
|
|
|
'base':None } |
|
|
|
contents = {'xsd':['annotation', 'simpleType', 'attribute',\ |
|
|
|
'attributeGroup', 'anyAttribute'] + RestrictionMarker.facets} |
|
|
|
tag = 'restriction' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -2422,6 +2472,7 @@ class LocalComplexType(ComplexType,\ |
|
|
|
required = [] |
|
|
|
attributes = {'id':None, |
|
|
|
'mixed':0} |
|
|
|
tag = 'complexType' |
|
|
|
|
|
|
|
|
|
|
|
class SimpleType(XMLSchemaComponent,\ |
|
|
@@ -2444,6 +2495,7 @@ class SimpleType(XMLSchemaComponent,\ |
|
|
|
'name':None, |
|
|
|
'final':lambda self: self._parent().getFinalDefault()} |
|
|
|
contents = {'xsd':['annotation', 'restriction', 'list', 'union']} |
|
|
|
tag = 'simpleType' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -2490,6 +2542,7 @@ class SimpleType(XMLSchemaComponent,\ |
|
|
|
attributes = {'id':None, |
|
|
|
'base':None } |
|
|
|
contents = {'xsd':['annotation', 'simpleType']+RestrictionMarker.facets} |
|
|
|
tag = 'restriction' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -2532,6 +2585,7 @@ class SimpleType(XMLSchemaComponent,\ |
|
|
|
attributes = {'id':None, |
|
|
|
'memberTypes':None } |
|
|
|
contents = {'xsd':['annotation', 'simpleType']} |
|
|
|
tag = 'union' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
@@ -2569,6 +2623,8 @@ class SimpleType(XMLSchemaComponent,\ |
|
|
|
attributes = {'id':None, |
|
|
|
'itemType':None } |
|
|
|
contents = {'xsd':['annotation', 'simpleType']} |
|
|
|
tag = 'list' |
|
|
|
|
|
|
|
def __init__(self, parent): |
|
|
|
XMLSchemaComponent.__init__(self, parent) |
|
|
|
self.annotation = None |
|
|
@@ -2605,6 +2661,7 @@ class AnonymousSimpleType(SimpleType,\ |
|
|
|
""" |
|
|
|
required = [] |
|
|
|
attributes = {'id':None} |
|
|
|
tag = 'simpleType' |
|
|
|
|
|
|
|
|
|
|
|
class Redefine: |
|
|
@@ -2614,7 +2671,8 @@ class Redefine: |
|
|
|
|
|
|
|
contents: |
|
|
|
""" |
|
|
|
pass |
|
|
|
tag = 'redefine' |
|
|
|
|
|
|
|
|
|
|
|
########################### |
|
|
|
########################### |
|
|
@@ -2647,330 +2705,3 @@ class TypeDescriptionComponent(tupleClass): |
|
|
|
def getName(self): |
|
|
|
return self[1] |
|
|
|
|
|
|
|
|
|
|
|
''' |
|
|
|
import string, types, base64, re |
|
|
|
from Utility import DOM, Collection |
|
|
|
from StringIO import StringIO |
|
|
|
|
|
|
|
|
|
|
|
class SchemaReader: |
|
|
|
"""A SchemaReader creates XMLSchema objects from urls and xml data.""" |
|
|
|
|
|
|
|
def loadFromStream(self, file): |
|
|
|
"""Return an XMLSchema instance loaded from a file object.""" |
|
|
|
document = DOM.loadDocument(file) |
|
|
|
schema = XMLSchema() |
|
|
|
schema.load(document) |
|
|
|
return schema |
|
|
|
|
|
|
|
def loadFromString(self, data): |
|
|
|
"""Return an XMLSchema instance loaded from an xml string.""" |
|
|
|
return self.loadFromStream(StringIO(data)) |
|
|
|
|
|
|
|
def loadFromURL(self, url): |
|
|
|
"""Return an XMLSchema instance loaded from the given url.""" |
|
|
|
document = DOM.loadFromURL(url) |
|
|
|
schema = XMLSchema() |
|
|
|
schema.location = url |
|
|
|
schema.load(document) |
|
|
|
return schema |
|
|
|
|
|
|
|
def loadFromFile(self, filename): |
|
|
|
"""Return an XMLSchema instance loaded from the given file.""" |
|
|
|
file = open(filename, 'rb') |
|
|
|
try: schema = self.loadFromStream(file) |
|
|
|
finally: file.close() |
|
|
|
return schema |
|
|
|
|
|
|
|
class SchemaError(Exception): |
|
|
|
pass |
|
|
|
|
|
|
|
class XMLSchema: |
|
|
|
# This is temporary, for the benefit of WSDL until the real thing works. |
|
|
|
def __init__(self, element): |
|
|
|
self.targetNamespace = DOM.getAttr(element, 'targetNamespace') |
|
|
|
self.element = element |
|
|
|
|
|
|
|
class realXMLSchema: |
|
|
|
"""A schema is a collection of schema components derived from one |
|
|
|
or more schema documents, that is, one or more <schema> element |
|
|
|
information items. It represents the abstract notion of a schema |
|
|
|
rather than a single schema document (or other representation).""" |
|
|
|
def __init__(self): |
|
|
|
self.simpleTypes = Collection(self) |
|
|
|
self.complexTypes = Collection(self) |
|
|
|
self.attributes = Collection(self) |
|
|
|
self.elements = Collection(self) |
|
|
|
self.attrGroups = Collection(self) |
|
|
|
self.idConstraints=None |
|
|
|
self.modelGroups = None |
|
|
|
self.notations = None |
|
|
|
self.extensions = [] |
|
|
|
|
|
|
|
targetNamespace = None |
|
|
|
attributeFormDefault = 'unqualified' |
|
|
|
elementFormDefault = 'unqualified' |
|
|
|
blockDefault = None |
|
|
|
finalDefault = None |
|
|
|
location = None |
|
|
|
version = None |
|
|
|
id = None |
|
|
|
|
|
|
|
def load(self, document): |
|
|
|
if document.nodeType == document.DOCUMENT_NODE: |
|
|
|
schema = DOM.getElement(document, 'schema', None, None) |
|
|
|
else: |
|
|
|
schema = document |
|
|
|
if schema is None: |
|
|
|
raise SchemaError('Missing <schema> element.') |
|
|
|
|
|
|
|
self.namespace = namespace = schema.namespaceURI |
|
|
|
if not namespace in DOM.NS_XSD_ALL: |
|
|
|
raise SchemaError( |
|
|
|
'Unknown XML schema namespace: %s.' % self.namespace |
|
|
|
) |
|
|
|
|
|
|
|
for attrname in ( |
|
|
|
'targetNamespace', 'attributeFormDefault', 'elementFormDefault', |
|
|
|
'blockDefault', 'finalDefault', 'version', 'id' |
|
|
|
): |
|
|
|
value = DOM.getAttr(schema, attrname, None, None) |
|
|
|
if value is not None: |
|
|
|
setattr(self, attrname, value) |
|
|
|
|
|
|
|
|
|
|
|
# Resolve imports and includes here? |
|
|
|
## imported = {} |
|
|
|
## while 1: |
|
|
|
## imports = [] |
|
|
|
## for element in DOM.getElements(definitions, 'import', NS_WSDL): |
|
|
|
## location = DOM.getAttr(element, 'location') |
|
|
|
## if not imported.has_key(location): |
|
|
|
## imports.append(element) |
|
|
|
## if not imports: |
|
|
|
## break |
|
|
|
## for element in imports: |
|
|
|
## self._import(document, element) |
|
|
|
## imported[location] = 1 |
|
|
|
|
|
|
|
for element in DOM.getElements(schema, None, None): |
|
|
|
localName = element.localName |
|
|
|
|
|
|
|
if not DOM.nsUriMatch(element.namespaceURI, namespace): |
|
|
|
self.extensions.append(element) |
|
|
|
continue |
|
|
|
|
|
|
|
elif localName == 'message': |
|
|
|
name = DOM.getAttr(element, 'name') |
|
|
|
docs = GetDocumentation(element) |
|
|
|
message = self.addMessage(name, docs) |
|
|
|
parts = DOM.getElements(element, 'part', NS_WSDL) |
|
|
|
message.load(parts) |
|
|
|
continue |
|
|
|
|
|
|
|
def _import(self, document, element): |
|
|
|
namespace = DOM.getAttr(element, 'namespace', default=None) |
|
|
|
location = DOM.getAttr(element, 'location', default=None) |
|
|
|
if namespace is None or location is None: |
|
|
|
raise WSDLError( |
|
|
|
'Invalid import element (missing namespace or location).' |
|
|
|
) |
|
|
|
|
|
|
|
# Sort-of support relative locations to simplify unit testing. The |
|
|
|
# WSDL specification actually doesn't allow relative URLs, so its |
|
|
|
# ok that this only works with urls relative to the initial document. |
|
|
|
location = urllib.basejoin(self.location, location) |
|
|
|
|
|
|
|
obimport = self.addImport(namespace, location) |
|
|
|
obimport._loaded = 1 |
|
|
|
|
|
|
|
importdoc = DOM.loadFromURL(location) |
|
|
|
try: |
|
|
|
if location.find('#') > -1: |
|
|
|
idref = location.split('#')[-1] |
|
|
|
imported = DOM.getElementById(importdoc, idref) |
|
|
|
else: |
|
|
|
imported = importdoc.documentElement |
|
|
|
if imported is None: |
|
|
|
raise WSDLError( |
|
|
|
'Import target element not found for: %s' % location |
|
|
|
) |
|
|
|
|
|
|
|
imported_tns = DOM.getAttr(imported, 'targetNamespace') |
|
|
|
importer_tns = namespace |
|
|
|
|
|
|
|
if imported_tns != importer_tns: |
|
|
|
return |
|
|
|
|
|
|
|
if imported.localName == 'definitions': |
|
|
|
imported_nodes = imported.childNodes |
|
|
|
else: |
|
|
|
imported_nodes = [imported] |
|
|
|
parent = element.parentNode |
|
|
|
for node in imported_nodes: |
|
|
|
if node.nodeType != node.ELEMENT_NODE: |
|
|
|
continue |
|
|
|
child = DOM.importNode(document, node, 1) |
|
|
|
parent.appendChild(child) |
|
|
|
child.setAttribute('targetNamespace', importer_tns) |
|
|
|
attrsNS = imported._attrsNS |
|
|
|
for attrkey in attrsNS.keys(): |
|
|
|
if attrkey[0] == DOM.NS_XMLNS: |
|
|
|
attr = attrsNS[attrkey].cloneNode(1) |
|
|
|
child.setAttributeNode(attr) |
|
|
|
finally: |
|
|
|
importdoc.unlink() |
|
|
|
|
|
|
|
|
|
|
|
class Element: |
|
|
|
"""Common base class for element representation classes.""" |
|
|
|
def __init__(self, name=None, documentation=''): |
|
|
|
self.name = name |
|
|
|
self.documentation = documentation |
|
|
|
self.extensions = [] |
|
|
|
|
|
|
|
def addExtension(self, item): |
|
|
|
self.extensions.append(item) |
|
|
|
|
|
|
|
|
|
|
|
class SimpleTypeDefinition: |
|
|
|
"""Represents an xml schema simple type definition.""" |
|
|
|
|
|
|
|
class ComplexTypeDefinition: |
|
|
|
"""Represents an xml schema complex type definition.""" |
|
|
|
|
|
|
|
class AttributeDeclaration: |
|
|
|
"""Represents an xml schema attribute declaration.""" |
|
|
|
|
|
|
|
class ElementDeclaration: |
|
|
|
"""Represents an xml schema element declaration.""" |
|
|
|
def __init__(self, name, type=None, targetNamespace=None): |
|
|
|
self.name = name |
|
|
|
|
|
|
|
targetNamespace = None |
|
|
|
annotation = None |
|
|
|
nillable = 0 |
|
|
|
abstract = 0 |
|
|
|
default = None |
|
|
|
fixed = None |
|
|
|
scope = 'global' |
|
|
|
type = None |
|
|
|
form = 0 |
|
|
|
# Things we will not worry about for now. |
|
|
|
id_constraint_defs = None |
|
|
|
sub_group_exclude = None |
|
|
|
sub_group_affils = None |
|
|
|
disallowed_subs = None |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AttributeGroupDefinition: |
|
|
|
"""Represents an xml schema attribute group definition.""" |
|
|
|
|
|
|
|
class IdentityConstraintDefinition: |
|
|
|
"""Represents an xml schema identity constraint definition.""" |
|
|
|
|
|
|
|
class ModelGroupDefinition: |
|
|
|
"""Represents an xml schema model group definition.""" |
|
|
|
|
|
|
|
class NotationDeclaration: |
|
|
|
"""Represents an xml schema notation declaration.""" |
|
|
|
|
|
|
|
class Annotation: |
|
|
|
"""Represents an xml schema annotation.""" |
|
|
|
|
|
|
|
class ModelGroup: |
|
|
|
"""Represents an xml schema model group.""" |
|
|
|
|
|
|
|
class Particle: |
|
|
|
"""Represents an xml schema particle.""" |
|
|
|
|
|
|
|
class WildCard: |
|
|
|
"""Represents an xml schema wildcard.""" |
|
|
|
|
|
|
|
class AttributeUse: |
|
|
|
"""Represents an xml schema attribute use.""" |
|
|
|
|
|
|
|
|
|
|
|
class ElementComponent: |
|
|
|
namespace = '' |
|
|
|
name = '' |
|
|
|
type = None |
|
|
|
form = 'qualified | unqualified' |
|
|
|
scope = 'global or complex def' |
|
|
|
constraint = ('value', 'default | fixed') |
|
|
|
nillable = 0 |
|
|
|
id_constraint_defs = None |
|
|
|
sub_group_affil = None |
|
|
|
sub_group_exclusions = None |
|
|
|
disallowed_subs = 'substitution, extension, restriction' |
|
|
|
abstract = 0 |
|
|
|
minOccurs = 1 |
|
|
|
maxOccurs = 1 |
|
|
|
ref = '' |
|
|
|
|
|
|
|
class AttributeThing: |
|
|
|
name = '' |
|
|
|
namespace = '' |
|
|
|
typeName = '' |
|
|
|
typeUri = '' |
|
|
|
scope = 'global | local to complex def' |
|
|
|
constraint = ('value:default', 'value:fixed') |
|
|
|
use = 'optional | prohibited | required' |
|
|
|
|
|
|
|
class ElementDataType: |
|
|
|
namespace = '' |
|
|
|
name = '' |
|
|
|
element_form = 'qualified | unqualified' |
|
|
|
attr_form = None |
|
|
|
type_name = '' |
|
|
|
type_uri = '' |
|
|
|
def __init__(self, name, namespace, type_name, type_uri): |
|
|
|
self.namespace = namespace |
|
|
|
self.name = name |
|
|
|
# type may be anonymous... |
|
|
|
self.type_name = type_name |
|
|
|
self.type_uri = type_uri |
|
|
|
|
|
|
|
def checkValue(self, value, context): |
|
|
|
# Delegate value checking to the type of the element. |
|
|
|
typeref = (self.type_uri, self.type_name) |
|
|
|
handler = context.serializer.getType(typeref) |
|
|
|
return handler.checkValue(value, context) |
|
|
|
|
|
|
|
def serialize(self, name, namespace, value, context, **kwargs): |
|
|
|
if context.check_values: |
|
|
|
self.checkValue(value, context) |
|
|
|
# Delegate serialization to the type of the element. |
|
|
|
typeref = (self.type_uri, self.type_name) |
|
|
|
handler = context.serializer.getType(typeref) |
|
|
|
return handler.serialize(self.name, self.namespace, value, context) |
|
|
|
|
|
|
|
def deserialize(self, element, context): |
|
|
|
if element_is_null(element, context): |
|
|
|
return None |
|
|
|
# Delegate deserialization to the type of the element. |
|
|
|
typeref = (self.type_uri, self.type_name) |
|
|
|
handler = context.serializer.getType(typeref) |
|
|
|
return handler.deserialize(element, context) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def parse_schema(data): |
|
|
|
targetNS = '' |
|
|
|
attributeFormDefault = 0 |
|
|
|
elementFormDefault = 0 |
|
|
|
blockDefault = '' |
|
|
|
finalDefault = '' |
|
|
|
language = None |
|
|
|
version = None |
|
|
|
id = '' |
|
|
|
''' |