def initialise(self, firstXmlPath, secondXmlPath): self.firstXml = GraphRootXmlDom(firstXmlPath) if self.firstXml.initialise() is False: return False pass self.secondXml = GraphRootXmlDom(secondXmlPath) if self.secondXml.initialise() is False: return False pass return True pass
class XmlMerger(object): def __init__(self): super(XmlMerger,self).__init__() self.actions = [] self.errorListener = ErrorListener() self.firstXml = None self.secondXml = None pass def initialise(self, firstXmlPath, secondXmlPath): self.firstXml = GraphRootXmlDom(firstXmlPath) if self.firstXml.initialise() is False: return False pass self.secondXml = GraphRootXmlDom(secondXmlPath) if self.secondXml.initialise() is False: return False pass return True pass def initErrorReporting(self, errorReporting): ErrorHandler.addListener(self.errorListener) ErrorHandler.setErrorReporting(errorReporting) return True pass def initLogging(self, logDir): logger = Logger() logger.initialise(logDir) ErrorHandler.importantMessage("Log created %s" % logger.getFileName() ) self.errorListener.setLogger(logger) return True pass def addAction(self, ruleName, query, Policy = QUERY_POLICY_BOTH, **params): action = dict( Query = query, RuleName = ruleName, Params = params, Policy = Policy ) self.actions.append(action) pass def save(self, path): return self.firstXml.save(path) pass def _initActionBoth(self, action, query, firstDomRoot, secondDomRoot ): firstResult = query.execute(firstDomRoot) if firstResult is None: ErrorHandler.warning( "xml query failed %s on %s" % (query, self.firstXml) ) return False pass secondResult = query.execute(secondDomRoot) if secondResult is None: ErrorHandler.warning( "xml query failed %s on %s" % (query, self.secondXml) ) return False pass if len(secondResult) != len(firstResult): ErrorHandler.warning( "xml query %s results have incompatible length %i != %i" % (query, len(secondResult),len(firstResult) ) ) return False pass if len(secondResult) != 1: ErrorHandler.warning( "xml query %s only single row result supported , you got %i" % (query, len(secondResult) ) ) return False pass action["Params"]["FirstXmlInput"] = firstResult[0] action["Params"]["SecondXmlInput"] = secondResult[0] return True pass def _initActionFirst(self, action, query, firstDomRoot ): firstResult = query.execute(firstDomRoot) if firstResult is None: ErrorHandler.warning( "xml query failed %s on %s" % (query, self.firstXml) ) return False pass if len(firstResult) != 1: ErrorHandler.warning( "xml query %s only single row result supported , you got %i" % (query, len(firstResult) ) ) return False pass action["Params"]["FirstXmlInput"] = firstResult[0] return True pass def merge(self): firstDomRoot = self.firstXml.getRootNode() secondDomRoot = self.secondXml.getRootNode() for action in self.actions: query = action["Query"] if action["Policy"] == QUERY_POLICY_BOTH: if self._initActionBoth(action, query, firstDomRoot, secondDomRoot) is False: continue pass pass elif action["Policy"] == QUERY_POLICY_ONLY_NEW: if self._initActionFirst(action, query, firstDomRoot) is False: continue pass pass else: ErrorHandler.error("Merge Query Policy not Support %s" % str(action["Policy"]) ) continue pass rule = MergeRuleFactory.getRule( action["RuleName"], action["Params"] ) if rule is None: ErrorHandler.warning( "Merge rule %s don`t exist" % action["RuleName"]) continue pass if rule.run() is False: ErrorHandler.warning( "Merge rule return False %s %s" % (action["RuleName"], query) ) pass pass pass pass