| @@ -266,6 +266,7 @@ class DOMAdapter(DOMAdapterInterface): | |||||
| class XMLBase: | class XMLBase: | ||||
| """ These class variables are for string indentation. | """ These class variables are for string indentation. | ||||
| """ | """ | ||||
| tag = None | |||||
| __indent = 0 | __indent = 0 | ||||
| __rlock = RLock() | __rlock = RLock() | ||||
| @@ -431,6 +432,27 @@ class XMLSchemaComponent(XMLBase, MarkerInterface): | |||||
| and type(self.__class__.contents) == type(XMLSchemaComponent.contents)): | and type(self.__class__.contents) == type(XMLSchemaComponent.contents)): | ||||
| raise RuntimeError, 'Bad type for a class variable in %s' %self.__class__ | 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): | def getTargetNamespace(self): | ||||
| """return targetNamespace | """return targetNamespace | ||||
| """ | """ | ||||
| @@ -597,6 +619,7 @@ class WSDLToolsAdapter(XMLSchemaComponent): | |||||
| """WSDL Adapter to grab the attributes from the wsdl document node. | """WSDL Adapter to grab the attributes from the wsdl document node. | ||||
| """ | """ | ||||
| attributes = {'name':None, 'targetNamespace':None} | attributes = {'name':None, 'targetNamespace':None} | ||||
| tag = 'definitions' | |||||
| def __init__(self, wsdl): | def __init__(self, wsdl): | ||||
| #XMLSchemaComponent.__init__(self, None) | #XMLSchemaComponent.__init__(self, None) | ||||
| @@ -624,6 +647,7 @@ class Notation(XMLSchemaComponent): | |||||
| required = ['name', 'public'] | required = ['name', 'public'] | ||||
| attributes = {'id':None, 'name':None, 'public':None, 'system':None} | attributes = {'id':None, 'name':None, 'public':None, 'system':None} | ||||
| contents = {'xsd':('annotation')} | contents = {'xsd':('annotation')} | ||||
| tag = 'notation' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -656,6 +680,7 @@ class Annotation(XMLSchemaComponent): | |||||
| """ | """ | ||||
| attributes = {'id':None} | attributes = {'id':None} | ||||
| contents = {'xsd':('documentation', 'appinfo')} | contents = {'xsd':('documentation', 'appinfo')} | ||||
| tag = 'annotation' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -691,6 +716,7 @@ class Annotation(XMLSchemaComponent): | |||||
| """ | """ | ||||
| attributes = {'source':None, 'xml:lang':None} | attributes = {'source':None, 'xml:lang':None} | ||||
| contents = {'xsd':('mixed', 'any')} | contents = {'xsd':('mixed', 'any')} | ||||
| tag = 'documentation' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -725,6 +751,7 @@ class Annotation(XMLSchemaComponent): | |||||
| """ | """ | ||||
| attributes = {'source':None, 'anyURI':None} | attributes = {'source':None, 'anyURI':None} | ||||
| contents = {'xsd':('mixed', 'any')} | contents = {'xsd':('mixed', 'any')} | ||||
| tag = 'appinfo' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -804,6 +831,7 @@ class XMLSchema(XMLSchemaComponent): | |||||
| 'attributeGroup', 'complexType', 'element', 'group',\ | 'attributeGroup', 'complexType', 'element', 'group',\ | ||||
| 'notation', 'simpleType', 'annotation')} | 'notation', 'simpleType', 'annotation')} | ||||
| empty_namespace = '' | empty_namespace = '' | ||||
| tag = 'schema' | |||||
| def __init__(self, parent=None): | def __init__(self, parent=None): | ||||
| """parent -- | """parent -- | ||||
| @@ -1066,6 +1094,7 @@ class XMLSchema(XMLSchemaComponent): | |||||
| 'namespace':None, | 'namespace':None, | ||||
| 'schemaLocation':None} | 'schemaLocation':None} | ||||
| contents = {'xsd':['annotation']} | contents = {'xsd':['annotation']} | ||||
| tag = 'import' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -1123,6 +1152,7 @@ class XMLSchema(XMLSchemaComponent): | |||||
| attributes = {'id':None, | attributes = {'id':None, | ||||
| 'schemaLocation':None} | 'schemaLocation':None} | ||||
| contents = {'xsd':['annotation']} | contents = {'xsd':['annotation']} | ||||
| tag = 'include' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -1147,10 +1177,7 @@ class XMLSchema(XMLSchemaComponent): | |||||
| and create a new Schema class instance. | and create a new Schema class instance. | ||||
| """ | """ | ||||
| if not self._schema: | if not self._schema: | ||||
| #schema = self._parent()._parent() | |||||
| schema = self._parent() | schema = self._parent() | ||||
| #self._schema = schema.getIncludeSchemas(\ | |||||
| # self.attributes['schemaLocation']) | |||||
| self._schema = schema.getIncludeSchemas().get(\ | self._schema = schema.getIncludeSchemas().get(\ | ||||
| self.attributes['schemaLocation'] | self.attributes['schemaLocation'] | ||||
| ) | ) | ||||
| @@ -1185,6 +1212,7 @@ class AttributeDeclaration(XMLSchemaComponent,\ | |||||
| 'default':None, | 'default':None, | ||||
| 'fixed':None} | 'fixed':None} | ||||
| contents = {'xsd':['annotation','simpleType']} | contents = {'xsd':['annotation','simpleType']} | ||||
| tag = 'attribute' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -1277,6 +1305,7 @@ class AttributeWildCard(XMLSchemaComponent,\ | |||||
| 'namespace':'##any', | 'namespace':'##any', | ||||
| 'processContents':'strict'} | 'processContents':'strict'} | ||||
| contents = {'xsd':['annotation']} | contents = {'xsd':['annotation']} | ||||
| tag = 'anyAttribute' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -1317,6 +1346,7 @@ class AttributeReference(XMLSchemaComponent,\ | |||||
| 'default':None, | 'default':None, | ||||
| 'fixed':None} | 'fixed':None} | ||||
| contents = {'xsd':['annotation']} | contents = {'xsd':['annotation']} | ||||
| tag = 'attribute' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -1351,6 +1381,7 @@ class AttributeGroupDefinition(XMLSchemaComponent,\ | |||||
| attributes = {'id':None, | attributes = {'id':None, | ||||
| 'name':None} | 'name':None} | ||||
| contents = {'xsd':['annotation']} | contents = {'xsd':['annotation']} | ||||
| tag = 'attributeGroup' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -1405,6 +1436,7 @@ class AttributeGroupReference(XMLSchemaComponent,\ | |||||
| attributes = {'id':None, | attributes = {'id':None, | ||||
| 'ref':None} | 'ref':None} | ||||
| contents = {'xsd':['annotation']} | contents = {'xsd':['annotation']} | ||||
| tag = 'attributeGroup' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -1501,6 +1533,7 @@ class IdentityConstrants(XMLSchemaComponent): | |||||
| attributes = {'id':None, | attributes = {'id':None, | ||||
| 'xpath':None} | 'xpath':None} | ||||
| contents = {'xsd':['annotation']} | contents = {'xsd':['annotation']} | ||||
| tag = 'selector' | |||||
| class Field(Constraint): | class Field(Constraint): | ||||
| """<field xpath> | """<field xpath> | ||||
| @@ -1516,6 +1549,7 @@ class IdentityConstrants(XMLSchemaComponent): | |||||
| attributes = {'id':None, | attributes = {'id':None, | ||||
| 'xpath':None} | 'xpath':None} | ||||
| contents = {'xsd':['annotation']} | contents = {'xsd':['annotation']} | ||||
| tag = 'field' | |||||
| class Unique(IdentityConstrants): | class Unique(IdentityConstrants): | ||||
| @@ -1533,6 +1567,7 @@ class Unique(IdentityConstrants): | |||||
| attributes = {'id':None, | attributes = {'id':None, | ||||
| 'name':None} | 'name':None} | ||||
| contents = {'xsd':['annotation', 'selector', 'field']} | contents = {'xsd':['annotation', 'selector', 'field']} | ||||
| tag = 'unique' | |||||
| class Key(IdentityConstrants): | class Key(IdentityConstrants): | ||||
| @@ -1552,6 +1587,7 @@ class Key(IdentityConstrants): | |||||
| attributes = {'id':None, | attributes = {'id':None, | ||||
| 'name':None} | 'name':None} | ||||
| contents = {'xsd':['annotation', 'selector', 'field']} | contents = {'xsd':['annotation', 'selector', 'field']} | ||||
| tag = 'key' | |||||
| class KeyRef(IdentityConstrants): | class KeyRef(IdentityConstrants): | ||||
| @@ -1571,6 +1607,7 @@ class KeyRef(IdentityConstrants): | |||||
| 'name':None, | 'name':None, | ||||
| 'refer':None} | 'refer':None} | ||||
| contents = {'xsd':['annotation', 'selector', 'field']} | contents = {'xsd':['annotation', 'selector', 'field']} | ||||
| tag = 'keyref' | |||||
| class ElementDeclaration(XMLSchemaComponent,\ | class ElementDeclaration(XMLSchemaComponent,\ | ||||
| @@ -1609,6 +1646,7 @@ class ElementDeclaration(XMLSchemaComponent,\ | |||||
| 'final':lambda self: self._parent().getFinalDefault()} | 'final':lambda self: self._parent().getFinalDefault()} | ||||
| contents = {'xsd':['annotation', 'simpleType', 'complexType', 'key',\ | contents = {'xsd':['annotation', 'simpleType', 'complexType', 'key',\ | ||||
| 'keyref', 'unique']} | 'keyref', 'unique']} | ||||
| tag = 'element' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -1704,6 +1742,7 @@ class ElementReference(XMLSchemaComponent,\ | |||||
| 'minOccurs':'1', | 'minOccurs':'1', | ||||
| 'maxOccurs':'1'} | 'maxOccurs':'1'} | ||||
| contents = {'xsd':['annotation']} | contents = {'xsd':['annotation']} | ||||
| tag = 'element' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -1744,6 +1783,7 @@ class ElementWildCard(LocalElementDeclaration,\ | |||||
| 'namespace':'##any', | 'namespace':'##any', | ||||
| 'processContents':'strict'} | 'processContents':'strict'} | ||||
| contents = {'xsd':['annotation']} | contents = {'xsd':['annotation']} | ||||
| tag = 'any' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -1783,6 +1823,7 @@ class Sequence(XMLSchemaComponent,\ | |||||
| 'maxOccurs':'1'} | 'maxOccurs':'1'} | ||||
| contents = {'xsd':['annotation', 'element', 'group', 'choice', 'sequence',\ | contents = {'xsd':['annotation', 'element', 'group', 'choice', 'sequence',\ | ||||
| 'any']} | 'any']} | ||||
| tag = 'sequence' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -1839,6 +1880,7 @@ class All(XMLSchemaComponent,\ | |||||
| 'minOccurs':'1', | 'minOccurs':'1', | ||||
| 'maxOccurs':'1'} | 'maxOccurs':'1'} | ||||
| contents = {'xsd':['annotation', 'element']} | contents = {'xsd':['annotation', 'element']} | ||||
| tag = 'all' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -1888,6 +1930,7 @@ class Choice(XMLSchemaComponent,\ | |||||
| 'maxOccurs':'1'} | 'maxOccurs':'1'} | ||||
| contents = {'xsd':['annotation', 'element', 'group', 'choice', 'sequence',\ | contents = {'xsd':['annotation', 'element', 'group', 'choice', 'sequence',\ | ||||
| 'any']} | 'any']} | ||||
| tag = 'choice' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -1944,6 +1987,7 @@ class ModelGroupDefinition(XMLSchemaComponent,\ | |||||
| attributes = {'id':None, | attributes = {'id':None, | ||||
| 'name':None} | 'name':None} | ||||
| contents = {'xsd':['annotation', 'all', 'choice', 'sequence']} | contents = {'xsd':['annotation', 'all', 'choice', 'sequence']} | ||||
| tag = 'group' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -1995,6 +2039,7 @@ class ModelGroupReference(XMLSchemaComponent,\ | |||||
| 'minOccurs':'1', | 'minOccurs':'1', | ||||
| 'maxOccurs':'1'} | 'maxOccurs':'1'} | ||||
| contents = {'xsd':['annotation']} | contents = {'xsd':['annotation']} | ||||
| tag = 'group' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -2045,6 +2090,7 @@ class ComplexType(XMLSchemaComponent,\ | |||||
| contents = {'xsd':['annotation', 'simpleContent', 'complexContent',\ | contents = {'xsd':['annotation', 'simpleContent', 'complexContent',\ | ||||
| 'group', 'all', 'choice', 'sequence', 'attribute', 'attributeGroup',\ | 'group', 'all', 'choice', 'sequence', 'attribute', 'attributeGroup',\ | ||||
| 'anyAttribute', 'any']} | 'anyAttribute', 'any']} | ||||
| tag = 'complexType' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -2151,6 +2197,7 @@ class ComplexType(XMLSchemaComponent,\ | |||||
| attributes = {'id':None, | attributes = {'id':None, | ||||
| 'mixed':0 } | 'mixed':0 } | ||||
| contents = {'xsd':['annotation', 'restriction', 'extension']} | contents = {'xsd':['annotation', 'restriction', 'extension']} | ||||
| tag = 'complexContent' | |||||
| class _DerivationBase(XMLSchemaComponent): | class _DerivationBase(XMLSchemaComponent): | ||||
| """<extension>,<restriction> | """<extension>,<restriction> | ||||
| @@ -2247,7 +2294,7 @@ class ComplexType(XMLSchemaComponent,\ | |||||
| annotation?, (group | all | choice | sequence)?, | annotation?, (group | all | choice | sequence)?, | ||||
| (attribute | attributeGroup)*, anyAttribute? | (attribute | attributeGroup)*, anyAttribute? | ||||
| """ | """ | ||||
| pass | |||||
| tag = 'extension' | |||||
| class Restriction(_DerivationBase,\ | class Restriction(_DerivationBase,\ | ||||
| RestrictionMarker): | RestrictionMarker): | ||||
| @@ -2262,7 +2309,7 @@ class ComplexType(XMLSchemaComponent,\ | |||||
| annotation?, (group | all | choice | sequence)?, | annotation?, (group | all | choice | sequence)?, | ||||
| (attribute | attributeGroup)*, anyAttribute? | (attribute | attributeGroup)*, anyAttribute? | ||||
| """ | """ | ||||
| pass | |||||
| tag = 'restriction' | |||||
| class SimpleContent(_DerivedType,\ | class SimpleContent(_DerivedType,\ | ||||
| @@ -2278,6 +2325,7 @@ class ComplexType(XMLSchemaComponent,\ | |||||
| """ | """ | ||||
| attributes = {'id':None} | attributes = {'id':None} | ||||
| contents = {'xsd':['annotation', 'restriction', 'extension']} | contents = {'xsd':['annotation', 'restriction', 'extension']} | ||||
| tag = 'simpleContent' | |||||
| class Extension(XMLSchemaComponent,\ | class Extension(XMLSchemaComponent,\ | ||||
| ExtensionMarker): | ExtensionMarker): | ||||
| @@ -2296,6 +2344,7 @@ class ComplexType(XMLSchemaComponent,\ | |||||
| 'base':None } | 'base':None } | ||||
| contents = {'xsd':['annotation', 'attribute', 'attributeGroup', | contents = {'xsd':['annotation', 'attribute', 'attributeGroup', | ||||
| 'anyAttribute']} | 'anyAttribute']} | ||||
| tag = 'extension' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -2359,6 +2408,7 @@ class ComplexType(XMLSchemaComponent,\ | |||||
| 'base':None } | 'base':None } | ||||
| contents = {'xsd':['annotation', 'simpleType', 'attribute',\ | contents = {'xsd':['annotation', 'simpleType', 'attribute',\ | ||||
| 'attributeGroup', 'anyAttribute'] + RestrictionMarker.facets} | 'attributeGroup', 'anyAttribute'] + RestrictionMarker.facets} | ||||
| tag = 'restriction' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -2422,6 +2472,7 @@ class LocalComplexType(ComplexType,\ | |||||
| required = [] | required = [] | ||||
| attributes = {'id':None, | attributes = {'id':None, | ||||
| 'mixed':0} | 'mixed':0} | ||||
| tag = 'complexType' | |||||
| class SimpleType(XMLSchemaComponent,\ | class SimpleType(XMLSchemaComponent,\ | ||||
| @@ -2444,6 +2495,7 @@ class SimpleType(XMLSchemaComponent,\ | |||||
| 'name':None, | 'name':None, | ||||
| 'final':lambda self: self._parent().getFinalDefault()} | 'final':lambda self: self._parent().getFinalDefault()} | ||||
| contents = {'xsd':['annotation', 'restriction', 'list', 'union']} | contents = {'xsd':['annotation', 'restriction', 'list', 'union']} | ||||
| tag = 'simpleType' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -2490,6 +2542,7 @@ class SimpleType(XMLSchemaComponent,\ | |||||
| attributes = {'id':None, | attributes = {'id':None, | ||||
| 'base':None } | 'base':None } | ||||
| contents = {'xsd':['annotation', 'simpleType']+RestrictionMarker.facets} | contents = {'xsd':['annotation', 'simpleType']+RestrictionMarker.facets} | ||||
| tag = 'restriction' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -2532,6 +2585,7 @@ class SimpleType(XMLSchemaComponent,\ | |||||
| attributes = {'id':None, | attributes = {'id':None, | ||||
| 'memberTypes':None } | 'memberTypes':None } | ||||
| contents = {'xsd':['annotation', 'simpleType']} | contents = {'xsd':['annotation', 'simpleType']} | ||||
| tag = 'union' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| @@ -2569,6 +2623,8 @@ class SimpleType(XMLSchemaComponent,\ | |||||
| attributes = {'id':None, | attributes = {'id':None, | ||||
| 'itemType':None } | 'itemType':None } | ||||
| contents = {'xsd':['annotation', 'simpleType']} | contents = {'xsd':['annotation', 'simpleType']} | ||||
| tag = 'list' | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| XMLSchemaComponent.__init__(self, parent) | XMLSchemaComponent.__init__(self, parent) | ||||
| self.annotation = None | self.annotation = None | ||||
| @@ -2605,6 +2661,7 @@ class AnonymousSimpleType(SimpleType,\ | |||||
| """ | """ | ||||
| required = [] | required = [] | ||||
| attributes = {'id':None} | attributes = {'id':None} | ||||
| tag = 'simpleType' | |||||
| class Redefine: | class Redefine: | ||||
| @@ -2614,7 +2671,8 @@ class Redefine: | |||||
| contents: | contents: | ||||
| """ | """ | ||||
| pass | |||||
| tag = 'redefine' | |||||
| ########################### | ########################### | ||||
| ########################### | ########################### | ||||
| @@ -2647,330 +2705,3 @@ class TypeDescriptionComponent(tupleClass): | |||||
| def getName(self): | def getName(self): | ||||
| return self[1] | 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 = '' | |||||
| ''' | |||||