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
    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, node1, node2):
        #TODO VERY SLOW, IMPROVE SPEED
        isParent1 = node1.hasChildren()
        isParent2 = node2.hasChildren()

        if  isParent1 != isParent2:
            ErrorHandler.warning("MergeRuleSectionIntelligence:: nodes in different tree has different structure with same tagName new %s, old %s" % (node1,node2) )
            return
            pass

        if isParent1 is True:
            self._mergeSection(node1, node2)
            pass
        else:
            self._mergeNodes(node1, node2)
            pass
        pass
 def _onParams( self, params ):
     blackList = params.pop("BlackList", None)
     self.blackList = []
     
     if blackList is None:
         return
         pass
     
     for query in blackList:
         result = query.execute(self.secondXmlInput)
         if result is None:
             ErrorHandler.warning("init black list error. graph query doesn`t work %s" % query)
             continue
             pass
         
         self.blackList.extend(result)
         pass
     pass
    def openDocument(self, pathToXml):
        document = None

        try:
            document = parse(pathToXml)
            pass
        except IOError as e:
            message = "Parser.parseToDom IOError %s in %s " % ( str(e) ,self )
            ErrorHandler.warning(message)
            return None
            pass
        except xml.parsers.expat.ExpatError as e:
            message = "Parser.parseToDom xml.parsers.expat.ExpatError %s in %s " % (str(e) , self )
            ErrorHandler.warning(message)
            return None
            pass

        return document
        pass