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)
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
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)
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))
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)
def getFloat(self): _value = self.get() try: return float(_value) except TypeError: raise dsException.dsError(6203, self.__emsg(6203), self.getName(), _value)
def getInt(self): _value = self.get() try: return int(_value) except TypeError: raise dsException.dsError(6202, self.__emsg(6202), self.getName(), _value)
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]
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
def buildFloat(self, strpara): _uparameter = dsParameter.dsParameter().validateConfigurePrameter( strpara) try: return float(_uparameter) except ValueError, inst: # 不是一个合法的数值 raise dsException.dsError(4002, self.__emsg(4002), _uparameter)
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)
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
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)))
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)
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
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()
def getFloat(self, index): _value = self.get(index) try: return float(_value) except TypeError: raise dsException.dsError(6102, self.__emsg(6102), index, _value)
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]
def get(self, index): try: return self.__data[index][1] except KeyError: raise dsException.dsError(6100, self.__emsg(6100), self.__data, index)
def getName(self): if self.__data is None: raise dsException.dsError(6200, self.__emsg(6200)) return self.__data[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))
def setProperty(self, name, value): if self.__data is None: raise dsException.dsError(6200, self.__emsg(6200)) self.__data[2][name] = value
def getInt(self, index): _value = self.get(index) try: return int(_value) except TypeError: raise dsException.dsError(6101, self.__emsg(6101), index, _value)
def indexOfNode(self, nodename): _nodenames = self.getNodes() try: return _nodenames.index(nodename) except ValueError: raise dsException.dsError(6309, self.__emsg(6309), nodename)