#!/usr/bin/python from PIPRes.util.server_import import * from PIPRes.util.client_import import * from PIPRes.service_impl.tree_merge_server import SCMTreeMerge from PIPRes.util.service_disambiguator import ByNameDisambiguator from PIPRes.cipres_types import CipresTree, toIDLTree import copy causeRegistryDeadlock = False _LOG = cipresGetLogger('pipres.service_impl.server.tree_merge.validate') returnPyTree = True showTreesOnError = True class ValidatingTreeMerge(CipresIDL_api1__POA.TreeMerge, SimpleServer): def __init__(self, regWrapper): self.registryWrapper = regWrapper SimpleServer.__init__(self, regWrapper) self.remoteObj = None self.pyTreeMerge = SCMTreeMerge(None) self.convertTreeFunc = self.orb is None and toTreeBridge or toIDLTree if causeRegistryDeadlock and self.remoteObj is None: _LOG.debug('Obtaining object reference to tree merger to be validated') self.remoteObj = self.registryWrapper.getServiceOrThrow(CipresIDL_api1.TreeMerge) def remove(self): if self.remoteObj is not None: self.remoteObj.remove() self.remoteObj = None SimpleServer.remove(self) def mergeTrees(self, treeList): if (not causeRegistryDeadlock) and self.remoteObj is None: _LOG.debug('Obtaining object reference to tree merger to be validated') self.remoteObj = self.registryWrapper.getServiceOrThrow(CipresIDL_api1.TreeMerge) _LOG.debug('Performing merger in python') treeFromPy = CipresTree(self.pyTreeMerge.mergeTrees(treeList)) _LOG.debug('Performing merger with external object reference') remoteTree = self.remoteObj.mergeTrees(treeList) cipRemoteTree = CipresTree(remoteTree) if treeFromPy != cipRemoteTree: if showTreesOnError: for n, t in enumerate(treeList): CipresTree(t).show('errorArg' + str(n) + '.dot') cipRemoteTree.show('externalAnswer.dot') treeFromPy.show('pythonTree.dot') err = 'The trees:\n%s\nResulted in a python merged Tree:\n%s\nbut an externally merged tree:\n%s\n' %('\n'.join([i.m_newick for i in treeList]), treeFromPy.m_newick, remoteTree.m_newick) _LOG.error(err) raise AssertionError, err _LOG.debug('Mergers agreed') return self.convertTreeFunc(returnPyTree and treeFromPy or remoteTree) def _getDisambiguatorFromArgs(argv): flag, flagArg = '-applicationName', 'the name of the tree merge service to validate' if flag in argv: idFlagIndex = argv.index(flag) if idFlagIndex + 1 == len(argv): sys.exit('%s flag must be followed with %s' %(flag, flagArg)) appName = argv[idFlagIndex + 1] else: raise ValueError, 'Expecting an %s flag followed by %s' % (flag, flagArg) return ByNameDisambiguator(True, TreeMerge = appName) def createValidatingTreeMerge(registry, argv): localReg = copy.copy(registry) localReg.duplicateServiceChooser = _getDisambiguatorFromArgs(argv) return ValidatingTreeMerge(localReg) if __name__=='__main__': try: argv = sys.argv disambig = _getDisambiguatorFromArgs(argv) cipresServe(argv, {'TreeMerge' : ValidatingTreeMerge}, disambiguator = disambig) except: logException(_LOG)