crule.py 3.0 KB

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