示例#1
0
    def parseStrNode(self, strnode):
        """ 将 '名称部分 ( 属性=值, ... )' 格式的 的字符串解
        析成为一个列表,(名称部分, {属性字典}) """

        # 使用 “(” 分开名称和属性
        _index = strnode.find("(")
        if _index == -1:
            _name = strnode.strip()
            return (_name, {})  # 只有名称,没有属性

        # 检查名称
        _name = strnode[:_index].strip()

        # 得到属性字符串
        _propstr = strnode[_index:].strip()
        if not (_propstr.startswith('(') and _propstr.endswith(')')):
            raise dsException.dsError(6009, self.__emsg(6009), strnode,
                                      _propstr)
        # 删除前后的括号以及括号里面的空格
        _propstr = _propstr.lstrip('(').rstrip(')').strip()

        # 分解属性字符串成为单独的属性
        _pdict = {}
        for kv in _propstr.split(','):
            _plist = kv.strip().split('=')
            if len(_plist) != 2:
                raise dsException.dsError(6010, self.__emsg(6010), strnode, kv)
            _pdict[_plist[0].strip()] = _plist[1].strip()

        # 返回分解的结果
        return (_name, _pdict)
示例#2
0
 def setValue(self, value):
     if self.__data is None:
         raise dsException.dsError(6200, self.__emsg(6200))
     if not (isinstance(value, int) or isinstance(value, long)
             or isinstance(value, float) or isinstance(value, basestring)):
         raise dsException.dsError(6204, self.__emsg(6204), self.getName(),
                                   value, type(value))
     self.__data[1] = value
示例#3
0
    def validateNamePattern(self, namepattern):
        """ 检查 namepattern 是否符合要求 """
        if not isinstance(namepattern, basestring):
            raise dsException.dsError(6007, self.__emsg(6007), namepattern,
                                      type(namepattern))

        # 检查是否有且只有一个修饰符
        if not len(namepattern.split("{0}")) == 2:
            raise dsException.dsError(6008, self.__emsg(6008), namepattern)
示例#4
0
 def setValue(self, index, value):
     if not (isinstance(value, int) or isinstance(value, long)
             or isinstance(value, float) or isinstance(value, basestring)):
         raise dsException.dsError(6103, self.__emsg(6103), value,
                                   type(value))
     try:
         self.__data[index][1] = value
     except KeyError:
         raise dsException.dsError(6100, self.__emsg(6100),
                                   (self.__data, index))
示例#5
0
 def validateNodeName(self, name):
     """ 校验可见视图中实体名称是否合法 """
     if not isinstance(name, basestring):
         raise dsException.dsError(6003, self.__emsg(6003), name,
                                   type(name))
     if len(name) == 0:
         raise dsException.dsError(6004, self.__emsg(6004))
     if name[0] in "1234567890":
         raise dsException.dsError(6005, self.__emsg(6005), name)
     for ch in r"!@#$%^&*()-=+`~'/\[](){},.<>?":
         if ch in name:
             raise dsException.dsError(6006, self.__emsg(6006), name, ch)
示例#6
0
 def getFloat(self):
     _value = self.get()
     try:
         return float(_value)
     except TypeError:
         raise dsException.dsError(6203, self.__emsg(6203), self.getName(),
                                   _value)
示例#7
0
 def getInt(self):
     _value = self.get()
     try:
         return int(_value)
     except TypeError:
         raise dsException.dsError(6202, self.__emsg(6202), self.getName(),
                                   _value)
示例#8
0
 def getChildren(self):
     if self.__data is None:
         raise dsException.dsError(6200, self.__emsg(6200))
     if self.__data[3] is None:
         return []
     else:
         return self.__data[3]
示例#9
0
 def getProperty(self, name, default=None):
     if self.__data is None:
         raise dsException.dsError(6200, self.__emsg(6200))
     _properties = self.__data[2]
     try:
         return _properties[name]
     except KeyError:
         return default
示例#10
0
 def buildFloat(self, strpara):
     _uparameter = dsParameter.dsParameter().validateConfigurePrameter(
         strpara)
     try:
         return float(_uparameter)
     except ValueError, inst:
         # 不是一个合法的数值
         raise dsException.dsError(4002, self.__emsg(4002), _uparameter)
示例#11
0
 def buildInteger(self, strpara, radix=10):
     _uparameter = dsParameter.dsParameter().validateConfigurePrameter(
         strpara)
     try:
         return int(_uparameter, radix)
     except ValueError, inst:
         # 不是一个合法的整数
         raise dsException.dsError(4001, self.__emsg(4001), _uparameter)
示例#12
0
 def getProperty(self, index, name, default=None):
     try:
         _properties = self.__data[index][2]
     except KeyError:
         raise dsException.dsError(6100, self.__emsg(6100),
                                   (self.__data, index))
     try:
         return _properties[name]
     except KeyError:
         return default
示例#13
0
 def indexOfEdge(self, sourcename, targetname):
     _edgenames = self.getEdges()
     try:
         return _edgenames.index(tuple((sourcename, targetname)))
     except ValueError:
         try:
             return _edgenames.index(tuple((targetname, sourcename)))
         except ValueError:
             raise dsException.dsError(6310, self.__emsg(6310),
                                       tuple((sourcename, targetname)))
示例#14
0
 def append(self, child):
     # 参数检查
     if (child is not None and not isinstance(child, dsTree)):
         raise dsException.dsError(6206, self.__emsg(6206), self.getName(),
                                   child, type(child))
     _children = self.getChildren()
     if len(_children) == 0:
         self.__setChildren([child])
     else:
         _children.append(child)
示例#15
0
 def validateConfigurePrameter(self, strparameter):
     """ 检查配置文件中的配置参数值,返回 unicode 编码
     的字符串值 """
     # 类型检查
     if not isinstance(strparameter, basestring):
         # 参数类型错误
         raise dsException.dsError(6001, self.__emsg(6001), strparameter,
                                   type(strparameter))
     else:
         # 长度检查
         if len(strparameter) > __MAX_PARAMETER_LENGTH__:
             raise dsException.dsError(6002, self.__emsg(6002),
                                       __MAX_PARAMETER_LENGTH__,
                                       strparameter[0:32])
         else:
             # unicode 转换
             if isinstance(strparameter, str):
                 return strparameter.decode('utf-8')
             else:
                 return strparameter
示例#16
0
    def build(self, strtree):
        """ 根据字符串树构建树,value 的缺省值是 name """

        # 参数检查
        strTree = self.validateConfigurePrameter(strtree)

        strtree = strtree.strip()
        if len(strtree) == 0:
            self.__data = None
            return

        _pnodes = []  # 存放全部的有孩子的结点
        _pairnodes = []  # 存放结点对 (名称,对应的列表)

        # 处理全部的复合结点
        for strnode in strtree.rstrip(';').split(';'):
            _couple = strnode.split(':')
            _name, _pdict = self.parseStrNode(_couple[0].strip())
            if _name == 'None':
                raise dsException.dsError(6201, self.__emsg(6201), strtree,
                                          strnode)
            self.validateNodeName(_name)
            try:
                _value = _pdict['value']
            except KeyError:
                _value = _name
            _node = dsTree(_name, _value, **_pdict)

            _pairnodes.append((_name, _node))
            if len(_couple) == 1:
                _pnodes.append((_node, None))
            else:
                _pnodes.append((_node, _couple[1]))

        # 将孩子结点的名称替换成为实际的实例
        for node, strchildren in _pnodes:
            if strchildren is None:
                continue
            _children = strchildren.strip().lstrip('[').rstrip(']').split(',')
            _snodes = []
            for childname in _children:
                childname = childname.strip()
                if childname in dict(_pairnodes):
                    node.append(dict(_pairnodes)[childname])
                else:
                    if childname == 'None':  # 特殊的子结点
                        node.append(None)
                    else:
                        self.validateNodeName(childname)
                        node.append(dsTree(childname, childname))

        # 设定 self.__data 根据 _pnodes[0][0]
        self.__data = _pnodes[0][0].__getData()
示例#17
0
 def getFloat(self, index):
     _value = self.get(index)
     try:
         return float(_value)
     except TypeError:
         raise dsException.dsError(6102, self.__emsg(6102), index, _value)
示例#18
0
    def build(self, strgraph):
        """ 根据图的字符串描述生成图列表结构,返回图列表
        
        失败抛出异常

        参数说明
            strgraph 是 unicode 的字符串图

        如果没有 value 属性的化,设置其值为字符串图中的名称。
        """

        # 检查从配置文件中得到的参数
        strgraph = self.validateConfigurePrameter(strgraph)

        # 空图
        if len(strgraph.strip()) == 0:
            self.__data = None
            return

        _nodes = []  # 存放结点表
        _edges = []  # 存放图的边
        _nodeNames = {}  # 存放结点名称和列表的对应关系

        # 分解 结点列表和边列表
        _plist = map(unicode.strip, strgraph.split(":"))
        if len(_plist) > 2:
            raise dsException.dsError(6301, self.__emsg(6301), strgraph)
        _strnodes = _plist[0]
        try:
            _stredges = _plist[1].strip().rstrip(';')
        except IndexError:
            _stredges = ""

        # 分解 结点组
        for snode in map(unicode.strip, _strnodes.split(";")):
            if snode == "":
                raise dsException.dsError(6302, self.__emsg(6302), _strnodes)

            # 分解结点
            _name, _pdict = self.parseStrNode(snode.strip())
            if _name == 'None':
                raise dsException.dsError(6303, self.__emsg(6303), _strnodes,
                                          snode)
            try:
                _value = _pdict['value']
            except KeyError:
                _value = _name

            # 增加结点
            if _name in _nodeNames:  # 重复定义
                raise dsException.dsError(6304, self.__emsg(6304), _strnodes,
                                          _name)
            _nodes.append([_name, _value, _pdict])
            _nodeNames[_name] = _nodes[-1]

        # 增加边
        if _stredges == "":
            self.__data = [_nodes, None]
            return

        for sedge in map(unicode.strip, _stredges.split(";")):
            # 分解边为结点对和属性
            _name, _pdict = self.parseStrNode(sedge.strip())
            _name = _name.strip()
            if not (_name.startswith('<') and _name.endswith('>')):
                raise dsException.dsError(6306, self.__emsg(6306), _stredges,
                                          sedge)
            # 分解结点对
            _plist = _name.lstrip('<').rstrip('>').split(',')
            if not (len(_plist) == 2):
                raise dsException.dsError(6307, self.__emsg(6307), sedge,
                                          _name)
            _source = _plist[0].strip()
            _target = _plist[1].strip()
            if _source not in _nodeNames:
                raise dsException.dsError(6305, self.__emsg(6305), sedge,
                                          _source)
            if not _target in _nodeNames:
                raise dsException.dsError(6305, self.__emsg(6305), sedge,
                                          _target)

            # 检查是否已经存在重复的边,不过,有的图允许
            # 两个结点之间存在多条边
            for edge in _edges:
                if (edge[0] == (_source, _target)
                        or edge[0] == (_target, _source)):
                    raise dsException.dsError(6308, self.__emsg(6308), sedge,
                                              edge[0])

            # 增加一条边
            _edges.append([(_source, _target), _pdict])

        # 返回图列表
        self.__data = [_nodes, _edges]
示例#19
0
 def get(self, index):
     try:
         return self.__data[index][1]
     except KeyError:
         raise dsException.dsError(6100, self.__emsg(6100), self.__data,
                                   index)
示例#20
0
 def getName(self):
     if self.__data is None:
         raise dsException.dsError(6200, self.__emsg(6200))
     return self.__data[0]
示例#21
0
 def setProperty(self, index, name, value):
     try:
         self.__data[index][2][name] = value
     except KeyError:
         raise dsException.dsError(6100, self.__emsg(6100),
                                   (self.__data, index))
示例#22
0
 def setProperty(self, name, value):
     if self.__data is None:
         raise dsException.dsError(6200, self.__emsg(6200))
     self.__data[2][name] = value
示例#23
0
 def getInt(self, index):
     _value = self.get(index)
     try:
         return int(_value)
     except TypeError:
         raise dsException.dsError(6101, self.__emsg(6101), index, _value)
示例#24
0
 def indexOfNode(self, nodename):
     _nodenames = self.getNodes()
     try:
         return _nodenames.index(nodename)
     except ValueError:
         raise dsException.dsError(6309, self.__emsg(6309), nodename)