crule.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. from ..tcore.composer import Composer
  2. from ...tconstants import TConstants as TC
  3. class CRule(Composer):
  4. def __init__(self,motifContext):
  5. self._mtContexts = []
  6. self._mtContexts.append(motifContext)
  7. self.cruleEnd = False
  8. self.packet = None
  9. def packet_in(self, packet):
  10. self.cruleEnd = False
  11. self._mtContexts[-1]._expired=False
  12. self._mtContexts[-1]._lastStep={}
  13. self.exception = None
  14. self.is_success = False
  15. self.packet = packet
  16. while not self.cruleEnd:
  17. result = self._step()
  18. self.is_success = result if result != None else False
  19. return self.packet
  20. def _nextRule(self) :
  21. mtc = self._mtContexts[-1]
  22. ns = mtc.nextStep()
  23. if 'id' in ns :
  24. fulltype = mtc.t['nodes'][ns['id']]['$type']
  25. if fulltype == mtc.metamodel+"CRule":
  26. #self._loadTransform(ns['rule'])
  27. return self._nextRule()
  28. elif fulltype.startswith('/Formalisms/__Transformations__/Transformation/T-Core') or\
  29. fulltype.startswith('/Formalisms/__Transformations__/Transformation/MoTif'):
  30. return ns
  31. elif 'trafoResult' in ns:
  32. return ns;
  33. def _step(self) :
  34. def runRule(r) :
  35. ar = r['rule']
  36. self.packet = ar.packet_in(self.packet)
  37. if ar.is_success :
  38. return (self.packet.deltas,TC.SUCCEEDED)
  39. elif not ar.is_success :
  40. if ar.exception :
  41. return (str(ar.exception),TC.EXCEPTION)
  42. else :
  43. return (None,TC.FAILED)
  44. try :
  45. nr = self._nextRule()
  46. except Exception :
  47. self.cruleEnd = True
  48. return
  49. if 'trafoResult' in nr:
  50. self.cruleEnd = True
  51. return nr['trafoResult']
  52. if nr.__class__ != {}.__class__ :
  53. self.cruleEnd = True
  54. return
  55. elif '$err' in nr :
  56. self.cruleEnd = True
  57. return
  58. else :
  59. (res,ai) = runRule(nr)
  60. self._mtContexts[-1].setLastStepApplicationInfo(ai)
  61. if ai == TC.FAILED :
  62. pass
  63. #self._aswPrintReq(TC.RULE_FAILURE_MSG+" ("+self._mtContexts[-1]._lastStep['alias']+":"+self._mtContexts[-1]._lastStep['name']+")")
  64. elif ai == TC.EXCEPTION :
  65. pass
  66. #self._aswPrintReq(TC.RULE_EXCEPTION_MSG + res)
  67. else :
  68. return True
  69. #self._mtContexts[-1].setLastStepFeedbackReceived()