Пример #1
0
    def load(self, fromfile):
        global _versionWithSingleHeader, _versionWithDifferentHeaders

        print('info: Loading alphabet file \'{0}\' ...'.format(fromfile))
        if not os.path.exists(fromfile):
            print('error: Alphabet file \'{0}\' does not exist!'.format(fromfile))
            return False

        dom = parse(fromfile)
        d = dom.getElementsByTagName('alphabet')
        if not d:
            print('error: Alphabet file is wrong formatted! There are no tag <alphabet>...</alphabet>')
            return False

        data = d[0]

        if data.hasAttribute('version'):
            versionText = data.getAttribute('version')
        elif data.hasAttribute('Version'):
            versionText = data.getAttribute('Version')
        else:
            versionText = ''

        if not versionText or '.' not in versionText:
            self.version = tuple(_versionWithSingleHeader)
            versionText = globals.versionToStr(self.version)
            print('warning: Alphabet file has no version. Default it to {0}'.format(versionText))
        else:
            self.version = globals.versionFromStr(versionText)
            print('info: Alphabet file version is {0}'.format(versionText))

        if self.version >= _versionWithDifferentHeaders:
            if not data.hasAttribute('headerTree'):
                print('error: No xml attribute <alphabet ... headerTree=\"...\" ...> in alphabet file')
                return False
            header = data.getAttribute('headerTree')
            if not header:
                print('error: Xml attribute <alphabet ... headerTree=\"\" ...> is empty in alphabet file')
                return False
            self.headerTree = header
            if not data.hasAttribute('headerLibrary'):
                print('error: No xml attribute <alphabet ... headerLibrary=\"...\" ...> in alphabet file')
                return False
            header = data.getAttribute('headerLibrary')
            if not header:
                print('error: Xml attribute <alphabet ... headerLibrary=\"\" ...> is empty in alphabet file')
                return False
            self.headerLibrary = header
        else:
            if not data.hasAttribute('header'):
                print('error: No xml attribute <alphabet ... header=\"...\" ...> in alphabet file')
                return False
            header = data.getAttribute('header')
            if not header:
                print('error: Xml attribute <alphabet ... header=\"\" ...> is empty in alphabet file')
                return False
            self.headerTree = header

        res = False
        classes = data.getElementsByTagName('class')
        if not classes:
            print('error: No classes in alphabet file. There must be tags <class>...</class>.')
            return False

        self.classes.clear()
        for cls in classes:
            res = (self.__parseClass(cls) or res)

        if res:
            self.path = fromfile

        return res
Пример #2
0
    def __loadTree(self, project, bt, nodes, filename):
        global _versionWithUids

        if not filename:
            return 0, []

        filename = toUnixPath(os.path.normpath(filename))

        print('info: Parsing \"{0}\" ...'.format(filename))
        dom = parse(filename)
        data = dom.getElementsByTagName(project.alphabet.headerTree)

        if not data:
            print('error: Wrong tree file!')
            print('')
            return 0, []

        mainNode = data[0]

        if mainNode.hasAttribute('Version'):
            versionText = mainNode.getAttribute('Version')
        elif mainNode.hasAttribute('version'):
            versionText = mainNode.getAttribute('version')
        else:
            versionText = ''

        if not versionText or '.' not in versionText:
            version = tuple(_versionWithUids)
            versionText = globals.versionToStr(version)
            print('info: File has no version. Default it to {0}'.format(versionText))
        else:
            version = globals.versionFromStr(versionText)
            print('info: File version is {0}'.format(versionText))

        # trying to read diagram file with saved diagram items positions:
        fname, _ = os.path.splitext(filename)
        diagram_file = fname + '.dgm'
        if os.path.exists(diagram_file):
            diagramData = parse(diagram_file).getElementsByTagName(project.alphabet.headerTree)
            if not diagramData:
                mainDiagramNode = None
            else:
                mainDiagramNode = diagramData[0]
        else:
            mainDiagramNode = None

        # getting all tags for main classes:
        xmlNodes = dict()
        topClasses = project.alphabet.getClasses(True)
        for t in topClasses:
            cls = topClasses[t]
            xml_nodes = mainNode.getElementsByTagName(cls.tag)
            if xml_nodes and cls.tag not in xmlNodes:
                if mainDiagramNode is not None:
                    diagramNodes = mainDiagramNode.getElementsByTagName(cls.tag)
                else:
                    diagramNodes = None
                xmlNodes[cls.tag] = [cls.name, xml_nodes, diagramNodes]
            # nodes = data[0].getElementsByTagName('Node')

        num_loaded = 0

        if not xmlNodes:  # not nodes:
            print('warning: Tree \"{0}\" is empty!'.format(filename))
            return 0, [filename]

        for tag in xmlNodes:
            cls = project.alphabet.getClass(xmlNodes[tag][0])
            xml_nodes = xmlNodes[tag][1]
            diagNodes = xmlNodes[tag][2]
            i = 0
            for xml_node in xml_nodes:
                if xml_node.parentNode is mainNode:
                    if diagNodes is not None and i < len(diagNodes) and diagNodes[i].parentNode is mainDiagramNode:
                        diagramNode = diagNodes[i]
                    else:
                        diagramNode = None
                    newNode = self.__parseNode(version, project, bt, nodes, filename, cls, xml_node, None, diagramNode)
                    if newNode is not None:
                        num_loaded += 1
                i += 1

        if num_loaded < 1:
            print('warning: no trees were loaded!')

        print('ok: Parsing complete.')
        print('')

        return num_loaded, [filename]
Пример #3
0
    def load(self, fromfile):
        global _versionWithSingleHeader, _versionWithDifferentHeaders

        print('info: Loading alphabet file \'{0}\' ...'.format(fromfile))
        if not os.path.exists(fromfile):
            print('error: Alphabet file \'{0}\' does not exist!'.format(
                fromfile))
            return False

        dom = parse(fromfile)
        d = dom.getElementsByTagName('alphabet')
        if not d:
            print(
                'error: Alphabet file is wrong formatted! There are no tag <alphabet>...</alphabet>'
            )
            return False

        data = d[0]

        if data.hasAttribute('version'):
            versionText = data.getAttribute('version')
        elif data.hasAttribute('Version'):
            versionText = data.getAttribute('Version')
        else:
            versionText = ''

        if not versionText or '.' not in versionText:
            self.version = tuple(_versionWithSingleHeader)
            versionText = globals.versionToStr(self.version)
            print('warning: Alphabet file has no version. Default it to {0}'.
                  format(versionText))
        else:
            self.version = globals.versionFromStr(versionText)
            print('info: Alphabet file version is {0}'.format(versionText))

        if self.version >= _versionWithDifferentHeaders:
            if not data.hasAttribute('headerTree'):
                print(
                    'error: No xml attribute <alphabet ... headerTree=\"...\" ...> in alphabet file'
                )
                return False
            header = data.getAttribute('headerTree')
            if not header:
                print(
                    'error: Xml attribute <alphabet ... headerTree=\"\" ...> is empty in alphabet file'
                )
                return False
            self.headerTree = header
            if not data.hasAttribute('headerLibrary'):
                print(
                    'error: No xml attribute <alphabet ... headerLibrary=\"...\" ...> in alphabet file'
                )
                return False
            header = data.getAttribute('headerLibrary')
            if not header:
                print(
                    'error: Xml attribute <alphabet ... headerLibrary=\"\" ...> is empty in alphabet file'
                )
                return False
            self.headerLibrary = header
        else:
            if not data.hasAttribute('header'):
                print(
                    'error: No xml attribute <alphabet ... header=\"...\" ...> in alphabet file'
                )
                return False
            header = data.getAttribute('header')
            if not header:
                print(
                    'error: Xml attribute <alphabet ... header=\"\" ...> is empty in alphabet file'
                )
                return False
            self.headerTree = header

        res = False
        classes = data.getElementsByTagName('class')
        if not classes:
            print(
                'error: No classes in alphabet file. There must be tags <class>...</class>.'
            )
            return False

        self.classes.clear()
        for cls in classes:
            res = (self.__parseClass(cls) or res)

        if res:
            self.path = fromfile

        return res
Пример #4
0
    def __loadTree(self, project, bt, nodes, filename):
        global _versionWithUids

        if not filename:
            return 0, []

        filename = toUnixPath(os.path.normpath(filename))

        print('info: Parsing \"{0}\" ...'.format(filename))
        dom = parse(filename)
        data = dom.getElementsByTagName(project.alphabet.headerTree)

        if not data:
            print('error: Wrong tree file!')
            print('')
            return 0, []

        mainNode = data[0]

        if mainNode.hasAttribute('Version'):
            versionText = mainNode.getAttribute('Version')
        elif mainNode.hasAttribute('version'):
            versionText = mainNode.getAttribute('version')
        else:
            versionText = ''

        if not versionText or '.' not in versionText:
            version = tuple(_versionWithUids)
            versionText = globals.versionToStr(version)
            print('info: File has no version. Default it to {0}'.format(
                versionText))
        else:
            version = globals.versionFromStr(versionText)
            print('info: File version is {0}'.format(versionText))

        # trying to read diagram file with saved diagram items positions:
        fname, _ = os.path.splitext(filename)
        diagram_file = fname + '.dgm'
        if os.path.exists(diagram_file):
            diagramData = parse(diagram_file).getElementsByTagName(
                project.alphabet.headerTree)
            if not diagramData:
                mainDiagramNode = None
            else:
                mainDiagramNode = diagramData[0]
        else:
            mainDiagramNode = None

        # getting all tags for main classes:
        xmlNodes = dict()
        topClasses = project.alphabet.getClasses(True)
        for t in topClasses:
            cls = project.alphabet.getClass(t)
            xml_nodes = mainNode.getElementsByTagName(cls.tag)
            if xml_nodes and cls.tag not in xmlNodes:
                if mainDiagramNode is not None:
                    diagramNodes = mainDiagramNode.getElementsByTagName(
                        cls.tag)
                else:
                    diagramNodes = None
                xmlNodes[cls.tag] = [cls.name, xml_nodes, diagramNodes]
            # nodes = data[0].getElementsByTagName('Node')

        num_loaded = 0

        if not xmlNodes:  # not nodes:
            print('warning: Tree \"{0}\" is empty!'.format(filename))
            return 0, [filename]

        for tag in xmlNodes:
            cls = project.alphabet.getClass(xmlNodes[tag][0])
            xml_nodes = xmlNodes[tag][1]
            diagNodes = xmlNodes[tag][2]
            i = 0
            for xml_node in xml_nodes:
                if xml_node.parentNode is mainNode:
                    if diagNodes is not None and i < len(
                            diagNodes
                    ) and diagNodes[i].parentNode is mainDiagramNode:
                        diagramNode = diagNodes[i]
                    else:
                        diagramNode = None
                    newNode = self.__parseNode(version, project, bt, nodes,
                                               filename, cls, xml_node, None,
                                               diagramNode)
                    if newNode is not None:
                        num_loaded += 1
                i += 1

        if num_loaded < 1:
            print('warning: no trees were loaded!')

        print('ok: Parsing complete.')
        print('')

        return num_loaded, [filename]