Exemplo n.º 1
0
    def parse_model(self, source):
        """
        Create classes, attributes, references and collections from the model.xml
        =========================================================================

        The xml can be provided as a file, url or string. This method
        is called during instantiation - it does not need to be called
        directly.

        @param source:  the model.xml, as a local file, string, or url
        @raise ModelParseError: if there is a problem parsing the source
        """
        try:
            io = openAnything(source)
            src = ''.join(io.readlines())
            doc = minidom.parseString(src)
            for node in doc.getElementsByTagName('model'):
                self.name = node.getAttribute('name')
                self.package_name = node.getAttribute('package')
                assert node.nextSibling is None, "More than one model element"
                assert self.name and self.package_name, "No model name or package name"

            for c in doc.getElementsByTagName('class'):
                class_name = c.getAttribute('name')
                assert class_name, "Name not defined in" + c.toxml()

                def strip_java_prefix(x):
                    return re.sub(r'.*\.', '', x)

                parents = map(strip_java_prefix,
                              c.getAttribute('extends').split(' '))
                interface = c.getAttribute('is-interface') == 'true'
                cl = Class(class_name, parents, self, interface)
                for a in c.getElementsByTagName('attribute'):
                    name = a.getAttribute('name')
                    type_name = strip_java_prefix(a.getAttribute('type'))
                    at = Attribute(name, type_name, cl)
                    cl.field_dict[name] = at
                for r in c.getElementsByTagName('reference'):
                    name = r.getAttribute('name')
                    type_name = r.getAttribute('referenced-type')
                    linked_field_name = r.getAttribute('reverse-reference')
                    ref = Reference(name, type_name, cl, linked_field_name)
                    cl.field_dict[name] = ref
                for co in c.getElementsByTagName('collection'):
                    name = co.getAttribute('name')
                    type_name = co.getAttribute('referenced-type')
                    linked_field_name = co.getAttribute('reverse-reference')
                    col = Collection(name, type_name, cl, linked_field_name)
                    cl.field_dict[name] = col
                self.classes[class_name] = cl
        except Exception, error:
            model_src = src if src is not None else source
            raise ModelParseError("Error parsing model", model_src, error)
Exemplo n.º 2
0
    def parse_model(self, source):
        """
        Create classes, attributes, references and collections from the model.xml
        =========================================================================

        The xml can be provided as a file, url or string. This method
        is called during instantiation - it does not need to be called
        directly.

        @param source:  the model.xml, as a local file, string, or url
        @raise ModelParseError: if there is a problem parsing the source
        """
        try:
            io = openAnything(source)
            src = ''.join(io.readlines())
            doc = minidom.parseString(src)
            for node in doc.getElementsByTagName('model'):
                self.name = node.getAttribute('name')
                self.package_name = node.getAttribute('package')
                assert node.nextSibling is None, "More than one model element"
                assert self.name and self.package_name, "No model name or package name"

            for c in doc.getElementsByTagName('class'):
                class_name = c.getAttribute('name')
                assert class_name, "Name not defined in" + c.toxml()
                def strip_java_prefix(x):
                    return re.sub(r'.*\.', '', x)
                parents = map(strip_java_prefix,
                        c.getAttribute('extends').split(' '))
                interface = c.getAttribute('is-interface') == 'true'
                cl =  Class(class_name, parents, self, interface)
                for a in c.getElementsByTagName('attribute'):
                    name = a.getAttribute('name')
                    type_name = strip_java_prefix(a.getAttribute('type'))
                    at = Attribute(name, type_name, cl)
                    cl.field_dict[name] = at
                for r in c.getElementsByTagName('reference'):
                    name = r.getAttribute('name')
                    type_name = r.getAttribute('referenced-type')
                    linked_field_name = r.getAttribute('reverse-reference')
                    ref = Reference(name, type_name, cl, linked_field_name)
                    cl.field_dict[name] = ref
                for co in c.getElementsByTagName('collection'):
                    name = co.getAttribute('name')
                    type_name = co.getAttribute('referenced-type')
                    linked_field_name = co.getAttribute('reverse-reference')
                    col = Collection(name, type_name, cl, linked_field_name)
                    cl.field_dict[name] = col
                self.classes[class_name] = cl
        except Exception, error:
            model_src = src if src is not None else source 
            raise ModelParseError("Error parsing model", model_src, error)
Exemplo n.º 3
0
    def parse_model(self, source):
        """
        Create classes, attributes, references and collections from the model.xml
        =========================================================================

        The xml can be provided as a file, url or string. This method
        is called during instantiation - it does not need to be called
        directly.

        @param source:  the model.xml, as a local file, string, or url
        @raise ModelParseError: if there is a problem parsing the source
        """
        try:
            io = openAnything(source)
            src = io.read()
            if hasattr(src,
                       'decode'):  # Handle binary and text streams equally.
                src = src.decode('utf8')
            self.LOG.debug("model = [{0}]".format(src))
            doc = minidom.parseString(src)
            for node in doc.getElementsByTagName('model'):
                self.name = node.getAttribute('name')
                self.package_name = node.getAttribute('package')
                assert node.nextSibling is None, "More than one model element"
                assert self.name and self.package_name, "No model name or package name"

            for c in doc.getElementsByTagName('class'):
                class_name = c.getAttribute('name')
                assert class_name, "Name not defined in" + c.toxml()

                def strip_java_prefix(x):
                    return re.sub(r'.*\.', '', x)

                parents = [
                    strip_java_prefix(p)
                    for p in c.getAttribute('extends').split(' ') if len(p)
                ]
                interface = c.getAttribute('is-interface') == 'true'
                cl = Class(class_name, parents, self, interface)
                self.LOG.debug('Created {0}'.format(cl.name))
                for a in c.getElementsByTagName('attribute'):
                    name = a.getAttribute('name')
                    type_name = strip_java_prefix(a.getAttribute('type'))
                    at = Attribute(name, type_name, cl)
                    cl.field_dict[name] = at
                    self.LOG.debug('set {0}.{1}'.format(cl.name, at.name))
                for r in c.getElementsByTagName('reference'):
                    name = r.getAttribute('name')
                    type_name = r.getAttribute('referenced-type')
                    linked_field_name = r.getAttribute('reverse-reference')
                    ref = Reference(name, type_name, cl, linked_field_name)
                    cl.field_dict[name] = ref
                    self.LOG.debug('set {0}.{1}'.format(cl.name, ref.name))
                for co in c.getElementsByTagName('collection'):
                    name = co.getAttribute('name')
                    type_name = co.getAttribute('referenced-type')
                    linked_field_name = co.getAttribute('reverse-reference')
                    col = Collection(name, type_name, cl, linked_field_name)
                    cl.field_dict[name] = col
                    self.LOG.debug('set {0}.{1}'.format(cl.name, col.name))
                self.classes[class_name] = cl
        except Exception as error:
            model_src = src if src is not None else source
            raise ModelParseError("Error parsing model", model_src, error)
        finally:
            if io is not None:
                io.close()
Exemplo n.º 4
0
    def parse_model(self, source):
        """
        Create classes, attributes, references and collections from the model.xml
        =========================================================================

        The xml can be provided as a file, url or string. This method
        is called during instantiation - it does not need to be called
        directly.

        @param source:  the model.xml, as a local file, string, or url
        @raise ModelParseError: if there is a problem parsing the source
        """
        try:
            io = openAnything(source)
            src = io.read()
            if hasattr(src, 'decode'): # Handle binary and text streams equally.
                src = src.decode('utf8')
            self.LOG.debug("model = [{0}]".format(src))
            doc = minidom.parseString(src)
            for node in doc.getElementsByTagName('model'):
                self.name = node.getAttribute('name')
                self.package_name = node.getAttribute('package')
                assert node.nextSibling is None, "More than one model element"
                assert self.name and self.package_name, "No model name or package name"

            for c in doc.getElementsByTagName('class'):
                class_name = c.getAttribute('name')
                assert class_name, "Name not defined in" + c.toxml()
                def strip_java_prefix(x):
                    return re.sub(r'.*\.', '', x)
                parents = [strip_java_prefix(p) for p in c.getAttribute('extends').split(' ') if len(p)]
                interface = c.getAttribute('is-interface') == 'true'
                cl = Class(class_name, parents, self, interface)
                self.LOG.debug('Created {0}'.format(cl.name))
                for a in c.getElementsByTagName('attribute'):
                    name = a.getAttribute('name')
                    type_name = strip_java_prefix(a.getAttribute('type'))
                    at = Attribute(name, type_name, cl)
                    cl.field_dict[name] = at
                    self.LOG.debug('set {0}.{1}'.format(cl.name, at.name))
                for r in c.getElementsByTagName('reference'):
                    name = r.getAttribute('name')
                    type_name = r.getAttribute('referenced-type')
                    linked_field_name = r.getAttribute('reverse-reference')
                    ref = Reference(name, type_name, cl, linked_field_name)
                    cl.field_dict[name] = ref
                    self.LOG.debug('set {0}.{1}'.format(cl.name, ref.name))
                for co in c.getElementsByTagName('collection'):
                    name = co.getAttribute('name')
                    type_name = co.getAttribute('referenced-type')
                    linked_field_name = co.getAttribute('reverse-reference')
                    col = Collection(name, type_name, cl, linked_field_name)
                    cl.field_dict[name] = col
                    self.LOG.debug('set {0}.{1}'.format(cl.name, col.name))
                self.classes[class_name] = cl
        except Exception as error:
            model_src = src if src is not None else source
            raise ModelParseError("Error parsing model", model_src, error)
        finally:
            if io is not None:
                io.close()