process_engine 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (409) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +37 -0
  4. data/app/assets/bower_components/process_engine/Snap.svg/CONTRIBUTING +3 -0
  5. data/app/assets/bower_components/process_engine/Snap.svg/Gruntfile.js +59 -0
  6. data/app/assets/bower_components/process_engine/Snap.svg/LICENSE +202 -0
  7. data/app/assets/bower_components/process_engine/Snap.svg/NOTICE +190 -0
  8. data/app/assets/bower_components/process_engine/Snap.svg/README.md +62 -0
  9. data/app/assets/bower_components/process_engine/Snap.svg/bower.json +25 -0
  10. data/app/assets/bower_components/process_engine/Snap.svg/component.json +13 -0
  11. data/app/assets/bower_components/process_engine/Snap.svg/dist/snap.svg-min.js +20 -0
  12. data/app/assets/bower_components/process_engine/Snap.svg/dist/snap.svg.js +7653 -0
  13. data/app/assets/bower_components/process_engine/Snap.svg/doc/css/dr.css +144 -0
  14. data/app/assets/bower_components/process_engine/Snap.svg/doc/css/main.css +508 -0
  15. data/app/assets/bower_components/process_engine/Snap.svg/doc/css/prism.css +168 -0
  16. data/app/assets/bower_components/process_engine/Snap.svg/doc/css/topcoat-desktop-light.css +3700 -0
  17. data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.eot +0 -0
  18. data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.svg +242 -0
  19. data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.ttf +0 -0
  20. data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.woff +0 -0
  21. data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-light-webfont.eot +0 -0
  22. data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-light-webfont.svg +243 -0
  23. data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-light-webfont.ttf +0 -0
  24. data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-light-webfont.woff +0 -0
  25. data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.eot +0 -0
  26. data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.svg +243 -0
  27. data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.ttf +0 -0
  28. data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.woff +0 -0
  29. data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.eot +0 -0
  30. data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.svg +243 -0
  31. data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.ttf +0 -0
  32. data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.woff +0 -0
  33. data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/stylesheet.css +57 -0
  34. data/app/assets/bower_components/process_engine/Snap.svg/doc/img/search.svg +11 -0
  35. data/app/assets/bower_components/process_engine/Snap.svg/doc/img/search_dark.svg +16 -0
  36. data/app/assets/bower_components/process_engine/Snap.svg/doc/js/prism.js +9 -0
  37. data/app/assets/bower_components/process_engine/Snap.svg/doc/reference.html +13633 -0
  38. data/app/assets/bower_components/process_engine/Snap.svg/dr.json +33 -0
  39. data/app/assets/bower_components/process_engine/Snap.svg/history.md +31 -0
  40. data/app/assets/bower_components/process_engine/Snap.svg/package.json +22 -0
  41. data/app/assets/bower_components/process_engine/Snap.svg/template.dot +157 -0
  42. data/app/assets/bower_components/process_engine/Snap.svg/test.html +75 -0
  43. data/app/assets/bower_components/process_engine/bpmn-js/LICENSE +22 -0
  44. data/app/assets/bower_components/process_engine/bpmn-js/README.md +46 -0
  45. data/app/assets/bower_components/process_engine/bpmn-js/bower.json +28 -0
  46. data/app/assets/bower_components/process_engine/bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css +40 -0
  47. data/app/assets/bower_components/process_engine/bpmn-js/dist/assets/bpmn-font/font/bpmn.eot +0 -0
  48. data/app/assets/bower_components/process_engine/bpmn-js/dist/assets/bpmn-font/font/bpmn.svg +21 -0
  49. data/app/assets/bower_components/process_engine/bpmn-js/dist/assets/bpmn-font/font/bpmn.ttf +0 -0
  50. data/app/assets/bower_components/process_engine/bpmn-js/dist/assets/bpmn-font/font/bpmn.woff +0 -0
  51. data/app/assets/bower_components/process_engine/bpmn-js/dist/assets/diagram-js.css +355 -0
  52. data/app/assets/bower_components/process_engine/bpmn-js/dist/bpmn-modeler.js +21552 -0
  53. data/app/assets/bower_components/process_engine/bpmn-js/dist/bpmn-modeler.js.map +1 -0
  54. data/app/assets/bower_components/process_engine/bpmn-js/dist/bpmn-modeler.min.js +8 -0
  55. data/app/assets/bower_components/process_engine/bpmn-js/dist/bpmn-navigated-viewer.js +13542 -0
  56. data/app/assets/bower_components/process_engine/bpmn-js/dist/bpmn-navigated-viewer.js.map +1 -0
  57. data/app/assets/bower_components/process_engine/bpmn-js/dist/bpmn-navigated-viewer.min.js +5 -0
  58. data/app/assets/bower_components/process_engine/bpmn-js/dist/bpmn-viewer.js +13294 -0
  59. data/app/assets/bower_components/process_engine/bpmn-js/dist/bpmn-viewer.js.map +1 -0
  60. data/app/assets/bower_components/process_engine/bpmn-js/dist/bpmn-viewer.min.js +5 -0
  61. data/app/assets/bower_components/process_engine/hammerjs/CHANGELOG.md +30 -0
  62. data/app/assets/bower_components/process_engine/hammerjs/CONTRIBUTING.md +41 -0
  63. data/app/assets/bower_components/process_engine/hammerjs/Gruntfile.coffee +123 -0
  64. data/app/assets/bower_components/process_engine/hammerjs/LICENSE.md +21 -0
  65. data/app/assets/bower_components/process_engine/hammerjs/README.md +6 -0
  66. data/app/assets/bower_components/process_engine/hammerjs/bower.json +9 -0
  67. data/app/assets/bower_components/process_engine/hammerjs/component.json +8 -0
  68. data/app/assets/bower_components/process_engine/hammerjs/hammer.js +2463 -0
  69. data/app/assets/bower_components/process_engine/hammerjs/hammer.min.js +7 -0
  70. data/app/assets/bower_components/process_engine/hammerjs/hammer.min.map +1 -0
  71. data/app/assets/bower_components/process_engine/hammerjs/package.json +50 -0
  72. data/app/assets/bower_components/process_engine/jquery/MIT-LICENSE.txt +21 -0
  73. data/app/assets/bower_components/process_engine/jquery/bower.json +27 -0
  74. data/app/assets/bower_components/process_engine/jquery/dist/jquery.js +9205 -0
  75. data/app/assets/bower_components/process_engine/jquery/dist/jquery.min.js +5 -0
  76. data/app/assets/bower_components/process_engine/jquery/dist/jquery.min.map +1 -0
  77. data/app/assets/bower_components/process_engine/jquery/src/ajax/jsonp.js +89 -0
  78. data/app/assets/bower_components/process_engine/jquery/src/ajax/load.js +75 -0
  79. data/app/assets/bower_components/process_engine/jquery/src/ajax/parseJSON.js +13 -0
  80. data/app/assets/bower_components/process_engine/jquery/src/ajax/parseXML.js +28 -0
  81. data/app/assets/bower_components/process_engine/jquery/src/ajax/script.js +64 -0
  82. data/app/assets/bower_components/process_engine/jquery/src/ajax/var/nonce.js +5 -0
  83. data/app/assets/bower_components/process_engine/jquery/src/ajax/var/rquery.js +3 -0
  84. data/app/assets/bower_components/process_engine/jquery/src/ajax/xhr.js +136 -0
  85. data/app/assets/bower_components/process_engine/jquery/src/ajax.js +786 -0
  86. data/app/assets/bower_components/process_engine/jquery/src/attributes/attr.js +141 -0
  87. data/app/assets/bower_components/process_engine/jquery/src/attributes/classes.js +158 -0
  88. data/app/assets/bower_components/process_engine/jquery/src/attributes/prop.js +94 -0
  89. data/app/assets/bower_components/process_engine/jquery/src/attributes/support.js +35 -0
  90. data/app/assets/bower_components/process_engine/jquery/src/attributes/val.js +161 -0
  91. data/app/assets/bower_components/process_engine/jquery/src/attributes.js +11 -0
  92. data/app/assets/bower_components/process_engine/jquery/src/callbacks.js +205 -0
  93. data/app/assets/bower_components/process_engine/jquery/src/core/access.js +60 -0
  94. data/app/assets/bower_components/process_engine/jquery/src/core/init.js +123 -0
  95. data/app/assets/bower_components/process_engine/jquery/src/core/parseHTML.js +39 -0
  96. data/app/assets/bower_components/process_engine/jquery/src/core/ready.js +97 -0
  97. data/app/assets/bower_components/process_engine/jquery/src/core/var/rsingleTag.js +4 -0
  98. data/app/assets/bower_components/process_engine/jquery/src/core.js +497 -0
  99. data/app/assets/bower_components/process_engine/jquery/src/css/addGetHookIf.js +22 -0
  100. data/app/assets/bower_components/process_engine/jquery/src/css/curCSS.js +57 -0
  101. data/app/assets/bower_components/process_engine/jquery/src/css/defaultDisplay.js +70 -0
  102. data/app/assets/bower_components/process_engine/jquery/src/css/hiddenVisibleSelectors.js +15 -0
  103. data/app/assets/bower_components/process_engine/jquery/src/css/support.js +96 -0
  104. data/app/assets/bower_components/process_engine/jquery/src/css/swap.js +28 -0
  105. data/app/assets/bower_components/process_engine/jquery/src/css/var/cssExpand.js +3 -0
  106. data/app/assets/bower_components/process_engine/jquery/src/css/var/getStyles.js +12 -0
  107. data/app/assets/bower_components/process_engine/jquery/src/css/var/isHidden.js +13 -0
  108. data/app/assets/bower_components/process_engine/jquery/src/css/var/rmargin.js +3 -0
  109. data/app/assets/bower_components/process_engine/jquery/src/css/var/rnumnonpx.js +5 -0
  110. data/app/assets/bower_components/process_engine/jquery/src/css.js +450 -0
  111. data/app/assets/bower_components/process_engine/jquery/src/data/Data.js +181 -0
  112. data/app/assets/bower_components/process_engine/jquery/src/data/accepts.js +20 -0
  113. data/app/assets/bower_components/process_engine/jquery/src/data/var/data_priv.js +5 -0
  114. data/app/assets/bower_components/process_engine/jquery/src/data/var/data_user.js +5 -0
  115. data/app/assets/bower_components/process_engine/jquery/src/data.js +178 -0
  116. data/app/assets/bower_components/process_engine/jquery/src/deferred.js +149 -0
  117. data/app/assets/bower_components/process_engine/jquery/src/deprecated.js +13 -0
  118. data/app/assets/bower_components/process_engine/jquery/src/dimensions.js +50 -0
  119. data/app/assets/bower_components/process_engine/jquery/src/effects/Tween.js +114 -0
  120. data/app/assets/bower_components/process_engine/jquery/src/effects/animatedSelector.js +13 -0
  121. data/app/assets/bower_components/process_engine/jquery/src/effects.js +648 -0
  122. data/app/assets/bower_components/process_engine/jquery/src/event/ajax.js +13 -0
  123. data/app/assets/bower_components/process_engine/jquery/src/event/alias.js +39 -0
  124. data/app/assets/bower_components/process_engine/jquery/src/event/support.js +9 -0
  125. data/app/assets/bower_components/process_engine/jquery/src/event.js +868 -0
  126. data/app/assets/bower_components/process_engine/jquery/src/exports/amd.js +24 -0
  127. data/app/assets/bower_components/process_engine/jquery/src/exports/global.js +32 -0
  128. data/app/assets/bower_components/process_engine/jquery/src/intro.js +44 -0
  129. data/app/assets/bower_components/process_engine/jquery/src/jquery.js +37 -0
  130. data/app/assets/bower_components/process_engine/jquery/src/manipulation/_evalUrl.js +18 -0
  131. data/app/assets/bower_components/process_engine/jquery/src/manipulation/support.js +32 -0
  132. data/app/assets/bower_components/process_engine/jquery/src/manipulation/var/rcheckableType.js +3 -0
  133. data/app/assets/bower_components/process_engine/jquery/src/manipulation.js +580 -0
  134. data/app/assets/bower_components/process_engine/jquery/src/offset.js +207 -0
  135. data/app/assets/bower_components/process_engine/jquery/src/outro.js +1 -0
  136. data/app/assets/bower_components/process_engine/jquery/src/queue/delay.js +22 -0
  137. data/app/assets/bower_components/process_engine/jquery/src/queue.js +142 -0
  138. data/app/assets/bower_components/process_engine/jquery/src/selector-native.js +172 -0
  139. data/app/assets/bower_components/process_engine/jquery/src/selector-sizzle.js +14 -0
  140. data/app/assets/bower_components/process_engine/jquery/src/selector.js +1 -0
  141. data/app/assets/bower_components/process_engine/jquery/src/serialize.js +111 -0
  142. data/app/assets/bower_components/process_engine/jquery/src/sizzle/dist/sizzle.js +2067 -0
  143. data/app/assets/bower_components/process_engine/jquery/src/sizzle/dist/sizzle.min.js +3 -0
  144. data/app/assets/bower_components/process_engine/jquery/src/sizzle/dist/sizzle.min.map +1 -0
  145. data/app/assets/bower_components/process_engine/jquery/src/traversing/findFilter.js +100 -0
  146. data/app/assets/bower_components/process_engine/jquery/src/traversing/var/rneedsContext.js +6 -0
  147. data/app/assets/bower_components/process_engine/jquery/src/traversing.js +199 -0
  148. data/app/assets/bower_components/process_engine/jquery/src/var/arr.js +3 -0
  149. data/app/assets/bower_components/process_engine/jquery/src/var/class2type.js +4 -0
  150. data/app/assets/bower_components/process_engine/jquery/src/var/concat.js +5 -0
  151. data/app/assets/bower_components/process_engine/jquery/src/var/hasOwn.js +5 -0
  152. data/app/assets/bower_components/process_engine/jquery/src/var/indexOf.js +5 -0
  153. data/app/assets/bower_components/process_engine/jquery/src/var/pnum.js +3 -0
  154. data/app/assets/bower_components/process_engine/jquery/src/var/push.js +5 -0
  155. data/app/assets/bower_components/process_engine/jquery/src/var/rnotwhite.js +3 -0
  156. data/app/assets/bower_components/process_engine/jquery/src/var/slice.js +5 -0
  157. data/app/assets/bower_components/process_engine/jquery/src/var/strundefined.js +3 -0
  158. data/app/assets/bower_components/process_engine/jquery/src/var/support.js +4 -0
  159. data/app/assets/bower_components/process_engine/jquery/src/var/toString.js +5 -0
  160. data/app/assets/bower_components/process_engine/jquery/src/wrap.js +79 -0
  161. data/app/assets/bower_components/process_engine/jquery-mousewheel/ChangeLog.md +141 -0
  162. data/app/assets/bower_components/process_engine/jquery-mousewheel/LICENSE.txt +20 -0
  163. data/app/assets/bower_components/process_engine/jquery-mousewheel/README.md +85 -0
  164. data/app/assets/bower_components/process_engine/jquery-mousewheel/bower.json +17 -0
  165. data/app/assets/bower_components/process_engine/jquery-mousewheel/jquery.mousewheel.js +221 -0
  166. data/app/assets/bower_components/process_engine/jquery-mousewheel/jquery.mousewheel.min.js +8 -0
  167. data/app/assets/bower_components/process_engine/lodash/LICENSE.txt +22 -0
  168. data/app/assets/bower_components/process_engine/lodash/bower.json +23 -0
  169. data/app/assets/bower_components/process_engine/lodash/dist/lodash.compat.js +7157 -0
  170. data/app/assets/bower_components/process_engine/lodash/dist/lodash.compat.min.js +61 -0
  171. data/app/assets/bower_components/process_engine/lodash/dist/lodash.js +6785 -0
  172. data/app/assets/bower_components/process_engine/lodash/dist/lodash.min.js +56 -0
  173. data/app/assets/bower_components/process_engine/lodash/dist/lodash.underscore.js +4979 -0
  174. data/app/assets/bower_components/process_engine/lodash/dist/lodash.underscore.min.js +39 -0
  175. data/app/assets/bower_components/process_engine/sax/AUTHORS +10 -0
  176. data/app/assets/bower_components/process_engine/sax/LICENSE +32 -0
  177. data/app/assets/bower_components/process_engine/sax/LICENSE-W3C.html +188 -0
  178. data/app/assets/bower_components/process_engine/sax/README.md +216 -0
  179. data/app/assets/bower_components/process_engine/sax/component.json +12 -0
  180. data/app/assets/bower_components/process_engine/sax/examples/big-not-pretty.xml +8002 -0
  181. data/app/assets/bower_components/process_engine/sax/examples/example.js +29 -0
  182. data/app/assets/bower_components/process_engine/sax/examples/get-products.js +58 -0
  183. data/app/assets/bower_components/process_engine/sax/examples/hello-world.js +4 -0
  184. data/app/assets/bower_components/process_engine/sax/examples/not-pretty.xml +8 -0
  185. data/app/assets/bower_components/process_engine/sax/examples/pretty-print.js +74 -0
  186. data/app/assets/bower_components/process_engine/sax/examples/shopping.xml +2 -0
  187. data/app/assets/bower_components/process_engine/sax/examples/strict.dtd +870 -0
  188. data/app/assets/bower_components/process_engine/sax/examples/test.html +15 -0
  189. data/app/assets/bower_components/process_engine/sax/examples/test.xml +1254 -0
  190. data/app/assets/bower_components/process_engine/sax/lib/sax.js +1410 -0
  191. data/app/assets/bower_components/process_engine/sax/package.json +12 -0
  192. data/app/assets/bower_components/process_engine/sax/test/attribute-name.js +33 -0
  193. data/app/assets/bower_components/process_engine/sax/test/attribute-no-space.js +75 -0
  194. data/app/assets/bower_components/process_engine/sax/test/buffer-overrun.js +26 -0
  195. data/app/assets/bower_components/process_engine/sax/test/case.js +50 -0
  196. data/app/assets/bower_components/process_engine/sax/test/cdata-chunked.js +11 -0
  197. data/app/assets/bower_components/process_engine/sax/test/cdata-end-split.js +15 -0
  198. data/app/assets/bower_components/process_engine/sax/test/cdata-fake-end.js +28 -0
  199. data/app/assets/bower_components/process_engine/sax/test/cdata-multiple.js +15 -0
  200. data/app/assets/bower_components/process_engine/sax/test/cdata.js +10 -0
  201. data/app/assets/bower_components/process_engine/sax/test/cyrillic.js +8 -0
  202. data/app/assets/bower_components/process_engine/sax/test/duplicate-attribute.js +13 -0
  203. data/app/assets/bower_components/process_engine/sax/test/emoji.js +12 -0
  204. data/app/assets/bower_components/process_engine/sax/test/end_empty_stream.js +5 -0
  205. data/app/assets/bower_components/process_engine/sax/test/entities.js +10 -0
  206. data/app/assets/bower_components/process_engine/sax/test/entity-mega.js +16 -0
  207. data/app/assets/bower_components/process_engine/sax/test/flush.js +13 -0
  208. data/app/assets/bower_components/process_engine/sax/test/index.js +86 -0
  209. data/app/assets/bower_components/process_engine/sax/test/issue-23.js +43 -0
  210. data/app/assets/bower_components/process_engine/sax/test/issue-30.js +24 -0
  211. data/app/assets/bower_components/process_engine/sax/test/issue-35.js +15 -0
  212. data/app/assets/bower_components/process_engine/sax/test/issue-47.js +12 -0
  213. data/app/assets/bower_components/process_engine/sax/test/issue-49.js +31 -0
  214. data/app/assets/bower_components/process_engine/sax/test/issue-84.js +13 -0
  215. data/app/assets/bower_components/process_engine/sax/test/parser-position.js +28 -0
  216. data/app/assets/bower_components/process_engine/sax/test/script-close-better.js +12 -0
  217. data/app/assets/bower_components/process_engine/sax/test/script.js +12 -0
  218. data/app/assets/bower_components/process_engine/sax/test/self-closing-child-strict.js +44 -0
  219. data/app/assets/bower_components/process_engine/sax/test/self-closing-child.js +44 -0
  220. data/app/assets/bower_components/process_engine/sax/test/self-closing-tag.js +25 -0
  221. data/app/assets/bower_components/process_engine/sax/test/stray-ending.js +17 -0
  222. data/app/assets/bower_components/process_engine/sax/test/trailing-attribute-no-value.js +10 -0
  223. data/app/assets/bower_components/process_engine/sax/test/trailing-non-whitespace.js +18 -0
  224. data/app/assets/bower_components/process_engine/sax/test/unclosed-root.js +11 -0
  225. data/app/assets/bower_components/process_engine/sax/test/unquoted.js +18 -0
  226. data/app/assets/bower_components/process_engine/sax/test/utf8-split.js +32 -0
  227. data/app/assets/bower_components/process_engine/sax/test/xmlns-as-tag-name.js +15 -0
  228. data/app/assets/bower_components/process_engine/sax/test/xmlns-issue-41.js +68 -0
  229. data/app/assets/bower_components/process_engine/sax/test/xmlns-rebinding.js +63 -0
  230. data/app/assets/bower_components/process_engine/sax/test/xmlns-strict.js +74 -0
  231. data/app/assets/bower_components/process_engine/sax/test/xmlns-unbound-element.js +33 -0
  232. data/app/assets/bower_components/process_engine/sax/test/xmlns-unbound.js +15 -0
  233. data/app/assets/bower_components/process_engine/sax/test/xmlns-xml-default-ns.js +31 -0
  234. data/app/assets/bower_components/process_engine/sax/test/xmlns-xml-default-prefix-attribute.js +36 -0
  235. data/app/assets/bower_components/process_engine/sax/test/xmlns-xml-default-prefix.js +21 -0
  236. data/app/assets/bower_components/process_engine/sax/test/xmlns-xml-default-redefine.js +41 -0
  237. data/app/assets/javascripts/process_engine/application.js +65 -0
  238. data/app/assets/stylesheets/process_engine/application.css +39 -0
  239. data/app/controllers/process_engine/application_controller.rb +28 -0
  240. data/app/controllers/process_engine/process_definitions_controller.rb +63 -0
  241. data/app/controllers/process_engine/process_instances_controller.rb +42 -0
  242. data/app/controllers/process_engine/process_tasks_controller.rb +23 -0
  243. data/app/helpers/process_engine/application_helper.rb +4 -0
  244. data/app/models/process_engine/consumer/consumer_task.rb +15 -0
  245. data/app/models/process_engine/error/false_task_state.rb +2 -0
  246. data/app/models/process_engine/listener/base.rb +49 -0
  247. data/app/models/process_engine/node_data_injection.rb +22 -0
  248. data/app/models/process_engine/parser/complex_gateway.rb +21 -0
  249. data/app/models/process_engine/parser/end_event.rb +23 -0
  250. data/app/models/process_engine/parser/exclusive_gateway.rb +25 -0
  251. data/app/models/process_engine/parser/extension/condition_expression.rb +39 -0
  252. data/app/models/process_engine/parser/extension/execution_listener.rb +15 -0
  253. data/app/models/process_engine/parser/extension/form_field.rb +50 -0
  254. data/app/models/process_engine/parser/extension/input_output.rb +28 -0
  255. data/app/models/process_engine/parser/extension/listener.rb +43 -0
  256. data/app/models/process_engine/parser/extension/property.rb +20 -0
  257. data/app/models/process_engine/parser/extension/task_listener.rb +15 -0
  258. data/app/models/process_engine/parser/extension/transitional_parameter.rb +53 -0
  259. data/app/models/process_engine/parser/inclusive_gateway.rb +25 -0
  260. data/app/models/process_engine/parser/parallel_gateway.rb +19 -0
  261. data/app/models/process_engine/parser/script_task.rb +37 -0
  262. data/app/models/process_engine/parser/sequence_flow.rb +36 -0
  263. data/app/models/process_engine/parser/start_event.rb +27 -0
  264. data/app/models/process_engine/parser/user_task.rb +36 -0
  265. data/app/models/process_engine/parser/xml_node.rb +125 -0
  266. data/app/models/process_engine/process_definition.rb +50 -0
  267. data/app/models/process_engine/process_instance.rb +72 -0
  268. data/app/models/process_engine/process_query.rb +52 -0
  269. data/app/models/process_engine/process_schema.rb +30 -0
  270. data/app/models/process_engine/process_task.rb +70 -0
  271. data/app/models/process_engine/schema/interceptor/exclusive_gateway.rb +39 -0
  272. data/app/models/process_engine/schema/node.rb +48 -0
  273. data/app/models/process_engine/schema/node_extension.rb +79 -0
  274. data/app/models/process_engine/schema/transition.rb +22 -0
  275. data/app/views/layouts/process_engine/application.html.erb +14 -0
  276. data/app/views/process_engine/layouts/_menu.html.haml +6 -0
  277. data/app/views/process_engine/layouts/application.html.haml +11 -0
  278. data/app/views/process_engine/process_definitions/_form.html.haml +6 -0
  279. data/app/views/process_engine/process_definitions/edit.html.haml +3 -0
  280. data/app/views/process_engine/process_definitions/index.html.haml +26 -0
  281. data/app/views/process_engine/process_definitions/new.html.haml +3 -0
  282. data/app/views/process_engine/process_definitions/show.html.haml +51 -0
  283. data/app/views/process_engine/process_instances/_form.html.haml +5 -0
  284. data/app/views/process_engine/process_instances/edit.html.haml +3 -0
  285. data/app/views/process_engine/process_instances/index.html.haml +29 -0
  286. data/app/views/process_engine/process_instances/show.html.haml +38 -0
  287. data/app/views/process_engine/process_tasks/index.html.haml +44 -0
  288. data/app/views/process_engine/share/_bpmn_canvas.html.haml +7 -0
  289. data/config/initializers/bower_rails.rb +16 -0
  290. data/config/initializers/simple_form.rb +166 -0
  291. data/config/initializers/simple_form_bootstrap.rb +135 -0
  292. data/config/locales/simple_form.en.yml +31 -0
  293. data/config/routes.rb +18 -0
  294. data/db/migrate/20150313063311_create_process_engine_process_definitions.rb +14 -0
  295. data/db/migrate/20150313063508_create_process_engine_process_instances.rb +15 -0
  296. data/db/migrate/20150313063633_create_process_engine_process_tasks.rb +30 -0
  297. data/lib/process_engine/engine.rb +12 -0
  298. data/lib/process_engine/version.rb +3 -0
  299. data/lib/process_engine.rb +8 -0
  300. data/lib/tasks/process_engine_tasks.rake +4 -0
  301. data/lib/templates/erb/scaffold/_form.html.erb +13 -0
  302. data/test/dummy/README.rdoc +28 -0
  303. data/test/dummy/Rakefile +6 -0
  304. data/test/dummy/app/assets/javascripts/application.js +13 -0
  305. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  306. data/test/dummy/app/controllers/application_controller.rb +5 -0
  307. data/test/dummy/app/helpers/application_helper.rb +2 -0
  308. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  309. data/test/dummy/bin/bundle +3 -0
  310. data/test/dummy/bin/rails +4 -0
  311. data/test/dummy/bin/rake +4 -0
  312. data/test/dummy/bin/setup +29 -0
  313. data/test/dummy/config/application.rb +26 -0
  314. data/test/dummy/config/boot.rb +5 -0
  315. data/test/dummy/config/database.yml +85 -0
  316. data/test/dummy/config/environment.rb +5 -0
  317. data/test/dummy/config/environments/development.rb +41 -0
  318. data/test/dummy/config/environments/production.rb +79 -0
  319. data/test/dummy/config/environments/test.rb +42 -0
  320. data/test/dummy/config/initializers/assets.rb +11 -0
  321. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  322. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  323. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  324. data/test/dummy/config/initializers/inflections.rb +16 -0
  325. data/test/dummy/config/initializers/mime_types.rb +4 -0
  326. data/test/dummy/config/initializers/session_store.rb +3 -0
  327. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  328. data/test/dummy/config/locales/en.yml +23 -0
  329. data/test/dummy/config/routes.rb +4 -0
  330. data/test/dummy/config/secrets.yml +22 -0
  331. data/test/dummy/config.ru +4 -0
  332. data/test/dummy/db/schema.rb +66 -0
  333. data/test/dummy/log/development.log +9722 -0
  334. data/test/dummy/public/404.html +67 -0
  335. data/test/dummy/public/422.html +67 -0
  336. data/test/dummy/public/500.html +66 -0
  337. data/test/dummy/public/favicon.ico +0 -0
  338. data/test/dummy/tmp/cache/assets/development/sass/8afee1847b645742b0d2535a7c32f4f22e7926ec/bootstrap.scssc +0 -0
  339. data/test/dummy/tmp/cache/assets/development/sass/b5911aa594334efca1023d6f01abce0758e9648a/bootstrap.scssc +0 -0
  340. data/test/dummy/tmp/cache/assets/development/sprockets/014d8413350c7d85a5429f5e2c9ac911 +0 -0
  341. data/test/dummy/tmp/cache/assets/development/sprockets/0cbd667d0fbf9e0e6f60b5ebf2f95fa3 +0 -0
  342. data/test/dummy/tmp/cache/assets/development/sprockets/0f7ba040a442530a6d4a5bc8307769c1 +0 -0
  343. data/test/dummy/tmp/cache/assets/development/sprockets/0fca2cc9aa38138660d8c7d492cf81e4 +0 -0
  344. data/test/dummy/tmp/cache/assets/development/sprockets/0ff24903c54f534941fbc96ff862e475 +0 -0
  345. data/test/dummy/tmp/cache/assets/development/sprockets/11100f87277a2892323fe5581af75a7b +0 -0
  346. data/test/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  347. data/test/dummy/tmp/cache/assets/development/sprockets/18a34084783e8b7f9bc871bc64b13eed +0 -0
  348. data/test/dummy/tmp/cache/assets/development/sprockets/1a3821ce28e0196075ed0830fcb45f38 +0 -0
  349. data/test/dummy/tmp/cache/assets/development/sprockets/1cf94b9a49ee68cb0f4065d48e9cbaf3 +0 -0
  350. data/test/dummy/tmp/cache/assets/development/sprockets/21a6373d6c40614fd05be57194c68248 +0 -0
  351. data/test/dummy/tmp/cache/assets/development/sprockets/26276ae8df51c046f3adc0b50a1521ba +0 -0
  352. data/test/dummy/tmp/cache/assets/development/sprockets/2eea4a8f4854d438cd03cb23a89b6d8c +0 -0
  353. data/test/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  354. data/test/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  355. data/test/dummy/tmp/cache/assets/development/sprockets/3993bcd8bae4771e550d8fc91d1debbc +0 -0
  356. data/test/dummy/tmp/cache/assets/development/sprockets/3ccc4edae36a9c4bd70fc330c9c83dc9 +0 -0
  357. data/test/dummy/tmp/cache/assets/development/sprockets/3e391b0f37505fffc40ba9ffa13330a2 +0 -0
  358. data/test/dummy/tmp/cache/assets/development/sprockets/42e258b77f5dd532dfb9344a2d766de6 +0 -0
  359. data/test/dummy/tmp/cache/assets/development/sprockets/43a5910cb7a330ece5856c0e9099efa2 +0 -0
  360. data/test/dummy/tmp/cache/assets/development/sprockets/4e65ec1149f01e749e1e372861210d4d +0 -0
  361. data/test/dummy/tmp/cache/assets/development/sprockets/501160bcee63ae68449a5a5eb78b6d41 +0 -0
  362. data/test/dummy/tmp/cache/assets/development/sprockets/517beb0bf366ec3c8649da9ac8a8a01e +0 -0
  363. data/test/dummy/tmp/cache/assets/development/sprockets/525a556b1eaacfa041722e1250d9859a +0 -0
  364. data/test/dummy/tmp/cache/assets/development/sprockets/56edbae38e4e0ff9f4b4fc576ae3d746 +0 -0
  365. data/test/dummy/tmp/cache/assets/development/sprockets/5b04f4a7058d92f88f89f2248bcc16b0 +0 -0
  366. data/test/dummy/tmp/cache/assets/development/sprockets/5c3c69f7c2520b57620931c150032d7e +0 -0
  367. data/test/dummy/tmp/cache/assets/development/sprockets/5d1f8f2111e14084ebf711412c9230d2 +0 -0
  368. data/test/dummy/tmp/cache/assets/development/sprockets/5f9833d6835900c56d0e76a1b2924cc2 +0 -0
  369. data/test/dummy/tmp/cache/assets/development/sprockets/67c653cc36eb639f7a7af5159e9f9de3 +0 -0
  370. data/test/dummy/tmp/cache/assets/development/sprockets/704b33432a5ba417bcd5962ad999c671 +0 -0
  371. data/test/dummy/tmp/cache/assets/development/sprockets/7301f83e8e67f30be13546a794a553ef +0 -0
  372. data/test/dummy/tmp/cache/assets/development/sprockets/7482c8f712712a79937caf41413bca15 +0 -0
  373. data/test/dummy/tmp/cache/assets/development/sprockets/761cb171e67ddca71e8b9c74f0220457 +0 -0
  374. data/test/dummy/tmp/cache/assets/development/sprockets/7e23bd4385e166267961b6d936363042 +0 -0
  375. data/test/dummy/tmp/cache/assets/development/sprockets/7e5100f290c9ba0d4c026e43b58d0d79 +0 -0
  376. data/test/dummy/tmp/cache/assets/development/sprockets/80743880e8d46958e9839ff9408c3113 +0 -0
  377. data/test/dummy/tmp/cache/assets/development/sprockets/8b8941aae968854bafb4638a86cad77b +0 -0
  378. data/test/dummy/tmp/cache/assets/development/sprockets/9c292f3b6b577a92970303c351e1d4a1 +0 -0
  379. data/test/dummy/tmp/cache/assets/development/sprockets/a3435b13cfa60fb7469a19703350bda7 +0 -0
  380. data/test/dummy/tmp/cache/assets/development/sprockets/a6ce1b2837383f1e8b62b7f1ddcc6820 +0 -0
  381. data/test/dummy/tmp/cache/assets/development/sprockets/a7e90acc68ba69b7cd5c0a7005467c4b +0 -0
  382. data/test/dummy/tmp/cache/assets/development/sprockets/be4d00fb7bf467b370f0fda7e453ec68 +0 -0
  383. data/test/dummy/tmp/cache/assets/development/sprockets/c4fbf44e63e40cbbf825fe750374728f +0 -0
  384. data/test/dummy/tmp/cache/assets/development/sprockets/c593bacb8d3f003125f91763a7b36b10 +0 -0
  385. data/test/dummy/tmp/cache/assets/development/sprockets/c5ae3bc69f7b1e1fdb51a667c9f3cdd6 +0 -0
  386. data/test/dummy/tmp/cache/assets/development/sprockets/cc843b336460771bf75c97cf0935301b +0 -0
  387. data/test/dummy/tmp/cache/assets/development/sprockets/ce3b6127737ed36f7b62a54acec06b3e +0 -0
  388. data/test/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  389. data/test/dummy/tmp/cache/assets/development/sprockets/d58931b13c55c146d21475e532b126ba +0 -0
  390. data/test/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  391. data/test/dummy/tmp/cache/assets/development/sprockets/dc6bbdc1e385c7bb2743011e9c2a7407 +0 -0
  392. data/test/dummy/tmp/cache/assets/development/sprockets/dd7270e11b484ae10f601e1dd014445a +0 -0
  393. data/test/dummy/tmp/cache/assets/development/sprockets/de86beefc60e0cd84dd1525af863e64d +0 -0
  394. data/test/dummy/tmp/cache/assets/development/sprockets/e0953e6e4a6c208e350f7f25d85bdce8 +0 -0
  395. data/test/dummy/tmp/cache/assets/development/sprockets/ec3b479833be43bf164a3deb119c3aee +0 -0
  396. data/test/dummy/tmp/cache/assets/development/sprockets/ef2cb0afc9a61a3d5819b4dfc84720ad +0 -0
  397. data/test/dummy/tmp/cache/assets/development/sprockets/f0511bbd6f6cd5530acddebb6d7e7044 +0 -0
  398. data/test/dummy/tmp/cache/assets/development/sprockets/f7009bba030498129042e0c542d4f264 +0 -0
  399. data/test/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  400. data/test/fixtures/process_engine/process_definitions.yml +17 -0
  401. data/test/fixtures/process_engine/process_instances.yml +11 -0
  402. data/test/fixtures/process_engine/process_tasks.yml +11 -0
  403. data/test/integration/navigation_test.rb +10 -0
  404. data/test/models/process_engine/process_definition_test.rb +9 -0
  405. data/test/models/process_engine/process_instance_test.rb +9 -0
  406. data/test/models/process_engine/process_task_test.rb +9 -0
  407. data/test/process_engine_test.rb +7 -0
  408. data/test/test_helper.rb +19 -0
  409. metadata +740 -0
@@ -0,0 +1,53 @@
1
+ class ProcessEngine::Parser::Extension::TransitionalParameter
2
+ attr_reader :element, :name
3
+
4
+ def initialize(element)
5
+ @element = element
6
+ @name = element["name"]
7
+ end
8
+
9
+ def list
10
+ l = element.xpath("camunda:list//camunda:value").map(&:content)
11
+ l.present? ? l : nil
12
+ end
13
+
14
+ def map
15
+ h = element.xpath("camunda:map//camunda:entry").each_with_object({}) do |item, hash|
16
+ hash[item["key"]] = item.content
17
+ end
18
+
19
+ h.present? ? h : nil
20
+ end
21
+
22
+ def string
23
+ element.elements.count == 0 ? element.content : nil
24
+ end
25
+
26
+ def script
27
+ sct = element.at_xpath("camunda:script")
28
+ return nil unless sct
29
+ obj = (Struct.new(:script_format, :script_content)).new
30
+ obj.script_format = sct["scriptFormat"]
31
+ obj.script_content = sct.content
32
+ obj
33
+ end
34
+
35
+ def type
36
+ %w(list string map script).find {|item| send(item).present? }
37
+ end
38
+
39
+ def value
40
+ send(type)
41
+ end
42
+
43
+ def to_h
44
+ {
45
+ type: type,
46
+ value: value
47
+ }
48
+ end
49
+
50
+ def self.factory(element, direction)
51
+ element.xpath("camunda:#{direction}").map { |el| new(el) }
52
+ end
53
+ end
@@ -0,0 +1,25 @@
1
+ class ProcessEngine::Parser::InclusiveGateway < ProcessEngine::Parser::XmlNode
2
+ def initialize(element)
3
+ super(element)
4
+ end
5
+
6
+ def default_flow
7
+ element["default"]
8
+ end
9
+
10
+ def extension_elements
11
+ # support [executionListener], [property]
12
+ custom_extension_elements(:execution_listeners, :properties)
13
+ end
14
+
15
+ def to_h
16
+ custom_ext = custom_extension_elements_hash(:execution_listeners, :properties)
17
+
18
+ super.merge({
19
+ extension: {
20
+ common: custom_ext,
21
+ default_flow: default_flow
22
+ }
23
+ })
24
+ end
25
+ end
@@ -0,0 +1,19 @@
1
+ class ProcessEngine::Parser::ParallelGateway < ProcessEngine::Parser::XmlNode
2
+ def initialize(element)
3
+ super(element)
4
+ end
5
+
6
+ def extension_elements
7
+ # support [executionListener], [property]
8
+ custom_extension_elements(:execution_listeners, :properties)
9
+ end
10
+
11
+ def to_h
12
+ custom_ext = custom_extension_elements_hash(:execution_listeners, :properties)
13
+ super.merge({
14
+ extension: {
15
+ common: custom_ext
16
+ }
17
+ })
18
+ end
19
+ end
@@ -0,0 +1,37 @@
1
+ class ProcessEngine::Parser::ScriptTask < ProcessEngine::Parser::XmlNode
2
+ def initialize(element)
3
+ super(element)
4
+ end
5
+
6
+ def script_format
7
+ element["scriptFormat"]
8
+ end
9
+
10
+ def resource
11
+ element["camunda:resource"]
12
+ end
13
+
14
+ def script
15
+ element.at_xpath("bpmn2:script").try(:content)
16
+ end
17
+
18
+ def extension_elements
19
+ # support [executionListener], [property], inputs_outputs
20
+ custom_extension_elements(:execution_listeners, :properties, :inputs_outputs)
21
+ end
22
+
23
+ def to_h
24
+ custom_ext = custom_extension_elements_hash(:execution_listeners, :properties, :inputs_outputs)
25
+
26
+ super.merge({
27
+ extension: {
28
+ common: custom_ext,
29
+ script_format: script_format,
30
+ resource: resource,
31
+ script: script
32
+ }
33
+ })
34
+ end
35
+
36
+
37
+ end
@@ -0,0 +1,36 @@
1
+ class ProcessEngine::Parser::SequenceFlow < ProcessEngine::Parser::XmlNode
2
+ def initialize(element)
3
+ super(element)
4
+ end
5
+
6
+ def source_ref
7
+ element["sourceRef"]
8
+ end
9
+
10
+ def target_ref
11
+ element["targetRef"]
12
+ end
13
+
14
+ def condition_expression
15
+ ProcessEngine::Parser::Extension::ConditionExpression.factory(element)
16
+ end
17
+
18
+ def extension_elements
19
+ # support [executionListener], [property]
20
+ custom_extension_elements(:execution_listeners, :properties)
21
+ end
22
+
23
+ def to_h
24
+ custom_ext = custom_extension_elements_hash(:execution_listeners, :properties)
25
+
26
+ super.merge({
27
+ extension: {
28
+ common: custom_ext,
29
+ condition_expression: condition_expression.to_h
30
+ },
31
+ source_ref: source_ref,
32
+ target_ref: target_ref,
33
+ })
34
+ end
35
+
36
+ end
@@ -0,0 +1,27 @@
1
+ class ProcessEngine::Parser::StartEvent < ProcessEngine::Parser::XmlNode
2
+ def initialize(element)
3
+ super(element)
4
+ end
5
+
6
+ def initiator
7
+ element["camunda:initiator"]
8
+ end
9
+
10
+ def extension_elements
11
+ # support [executionListener], [formField], [property]
12
+ custom_extension_elements(:execution_listeners, :form_fields, :properties)
13
+ end
14
+
15
+ def to_h
16
+ custom_ext = custom_extension_elements_hash(:execution_listeners, :form_fields, :properties)
17
+
18
+ super.merge({
19
+ extension: {
20
+ common: custom_ext,
21
+ initiator: initiator
22
+ }
23
+ })
24
+ end
25
+
26
+
27
+ end
@@ -0,0 +1,36 @@
1
+ class ProcessEngine::Parser::UserTask < ProcessEngine::Parser::XmlNode
2
+ def initialize(element)
3
+ super(element)
4
+ end
5
+
6
+ def extension_elements
7
+ # support [executionListener], [taskListener], [formField], [property], inputs_outputs
8
+ custom_extension_elements(:execution_listeners, :task_listeners, :form_fields, :properties, :inputs_outputs)
9
+ end
10
+
11
+ def assignee
12
+ element["camunda:assignee"]
13
+ end
14
+
15
+ def candidate_users
16
+ (element["camunda:candidateUsers"].try(:split, ",") || []).map(&:strip).select(&:present?)
17
+ end
18
+
19
+ def candidate_groups
20
+ (element["camunda:candidateGroups"].try(:split, ",") || []).map(&:strip).select(&:present?)
21
+ end
22
+
23
+ def to_h
24
+ custom_ext = custom_extension_elements_hash(:execution_listeners, :task_listeners, :form_fields, :properties, :inputs_outputs)
25
+
26
+ super.merge({
27
+ extension: {
28
+ common: custom_ext,
29
+ assignee: assignee,
30
+ candidate_users: candidate_users,
31
+ candidate_groups: candidate_groups
32
+ }
33
+ })
34
+ end
35
+
36
+ end
@@ -0,0 +1,125 @@
1
+ class ProcessEngine::Parser::XmlNode
2
+ TYPES_GATEWAY = %w(exclusiveGateway parallelGateway inclusiveGateway complexGateway)
3
+ TYPES_EVENT = %w(startEvent endEvent)
4
+ TYPES_TASK = %w(scriptTask userTask)
5
+ TYPES_FLOW = %w(sequenceFlow)
6
+
7
+ attr_reader :id, :name, :node_type, :element
8
+
9
+ def initialize(element)
10
+ @id = element["id"]
11
+ @name = element["name"]
12
+ @node_type = element.name
13
+ @element = element
14
+ end
15
+
16
+ def incoming_strings
17
+ element.xpath("bpmn2:incoming").map(&:content)
18
+ end
19
+
20
+ def outgoing_strings
21
+ element.xpath("bpmn2:outgoing").map(&:content)
22
+ end
23
+
24
+ def extension_elements
25
+ raise "Not imlpmented"
26
+ end
27
+
28
+ def documentation
29
+ element.at_xpath("bpmn2:documentation").try(:content)
30
+ end
31
+
32
+ def type_gateway?
33
+ TYPES_GATEWAY.include?(node_type)
34
+ end
35
+
36
+ def type_event?
37
+ TYPES_EVENT.include?(node_type)
38
+ end
39
+
40
+ def type_task?
41
+ TYPES_TASK.include?(node_type)
42
+ end
43
+
44
+ def type_flow?
45
+ TYPES_FLOW.include?(node_type)
46
+ end
47
+
48
+ def to_h
49
+ {
50
+ node_id: id,
51
+ node_type: node_type,
52
+ name: name
53
+ }
54
+ end
55
+
56
+ class << self
57
+ def factory(element)
58
+ case element.name
59
+ when "startEvent"
60
+ ProcessEngine::Parser::StartEvent.new(element)
61
+ when "endEvent"
62
+ ProcessEngine::Parser::EndEvent.new(element)
63
+ when "userTask"
64
+ ProcessEngine::Parser::UserTask.new(element)
65
+ when "scriptTask"
66
+ ProcessEngine::Parser::ScriptTask.new(element)
67
+ when "parallelGateway"
68
+ ProcessEngine::Parser::ParallelGateway.new(element)
69
+ when "exclusiveGateway"
70
+ ProcessEngine::Parser::ExclusiveGateway.new(element)
71
+ when "complexGateway"
72
+ ProcessEngine::Parser::ComplexGateway.new(element)
73
+ when "inclusiveGateway"
74
+ ProcessEngine::Parser::InclusiveGateway.new(element)
75
+ when "sequenceFlow"
76
+ ProcessEngine::Parser::SequenceFlow.new(element)
77
+ else
78
+ nil
79
+ end
80
+ end
81
+ end
82
+
83
+ private
84
+
85
+ def custom_extension_elements(*extension_props)
86
+ ext = element.at_xpath("bpmn2:extensionElements")
87
+ return nil unless ext
88
+
89
+ extension = ProcessEngine::Parser::Extension
90
+
91
+ parser = {
92
+ execution_listeners: ProcessEngine::Parser::Extension::ExecutionListener,
93
+ task_listeners: ProcessEngine::Parser::Extension::TaskListener,
94
+ form_fields: ProcessEngine::Parser::Extension::FormField,
95
+ properties: ProcessEngine::Parser::Extension::Property,
96
+ inputs_outputs: ProcessEngine::Parser::Extension::InputOutput
97
+ }
98
+
99
+ intersect = extension_props & parser.keys
100
+ obj = (Struct.new *intersect).new
101
+ intersect.each do |prop|
102
+ obj[prop] = parser[prop].factory(ext)
103
+ end
104
+
105
+ obj
106
+ end
107
+
108
+ def custom_extension_elements_hash(*extension_props)
109
+
110
+ ee = extension_elements
111
+ return {} unless ee
112
+
113
+ available_hash = {
114
+ execution_listeners: ee.try(:execution_listeners).try(:map){ |item| item.to_h },
115
+ task_listeners: ee.try(:task_listeners).try(:map){ |item| item.to_h },
116
+ form_fields: ee.try(:form_fields).try(:map){ |item| item.to_h },
117
+ properties: ee.try(:properties).try(:map){ |item| item.to_h },
118
+ inputs_outputs: ee.try(:inputs_outputs).try(:to_h)
119
+ }
120
+
121
+ intersect = extension_props & available_hash.keys
122
+ available_hash.slice(*intersect)
123
+ end
124
+
125
+ end
@@ -0,0 +1,50 @@
1
+ module ProcessEngine
2
+ class ProcessDefinition < ActiveRecord::Base
3
+ has_many :process_instances, dependent: :destroy
4
+ validates :name, presence: true
5
+ validates :slug, presence: true, uniqueness: true
6
+
7
+ scope :desc, -> { order('id desc') }
8
+ scope :asc, -> { order('id asc') }
9
+
10
+ before_save :update_json_from_xml
11
+ before_save :update_starting_node
12
+ validate :check_xml_format
13
+
14
+
15
+ def schema
16
+ ProcessEngine::ProcessSchema.new(self)
17
+ end
18
+
19
+ private
20
+
21
+ def update_json_from_xml
22
+ return unless bpmn_xml_changed?
23
+ doc = Nokogiri::XML(bpmn_xml)
24
+ process = doc.at_xpath('//bpmn2:process') rescue nil
25
+
26
+ return unless process.present?
27
+ elements = process.elements.map{ |el| ProcessEngine::Parser::XmlNode.factory(el) }.compact
28
+
29
+ graph = elements.each_with_object({nodes: [], transitions: []}) do |el, hash|
30
+ unless el.type_flow?
31
+ hash[:nodes] << el.to_h
32
+ else
33
+ hash[:transitions] << el.to_h
34
+ end
35
+ end
36
+
37
+ self.bpmn_json = graph
38
+ end
39
+
40
+ def update_starting_node
41
+ starter_node = schema.nodes_by_type(ProcessEngine::Schema::Node::NodeType::START_EVENT).first
42
+ self.starting_node = starter_node.node_id if starter_node
43
+ end
44
+
45
+ def check_xml_format
46
+ doc = Nokogiri.XML(bpmn_xml)
47
+ errors.add(:bpmn_xml, 'is invalid') if bpmn_xml.present? && (doc.errors.count > 0 || (doc.at_xpath('//bpmn2:process') rescue nil).nil?)
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,72 @@
1
+ module ProcessEngine
2
+ class ProcessInstance < ActiveRecord::Base
3
+ enum status: { movable: 0, waiting: 1, finished: 2 } # check if required to check for branching
4
+
5
+ belongs_to :process_definition
6
+ has_many :process_tasks, dependent: :destroy
7
+
8
+ scope :desc, -> { order('id desc') }
9
+ scope :asc, -> { order('id asc') }
10
+
11
+ def move_to_next_state(pdn_slug_state, options = {})
12
+ move_to_next_cur_state(pdn_slug_state, [], options)
13
+ end
14
+
15
+ def start
16
+ update_attributes!(states: [process_definition.starting_node])
17
+ begin_process_instance
18
+ self
19
+ end
20
+
21
+ def process_tasks_by_state_name(state_name)
22
+ process_tasks.by_state(state_name).desc
23
+ end
24
+
25
+ def last_process_task_by_state_name(state_name)
26
+ process_tasks_by_state_name(state_name).first
27
+ end
28
+
29
+ private
30
+
31
+ def begin_process_instance
32
+ ProcessEngine::ProcessTask.spawn_new_task(self, states.first, { assignee: creator })
33
+ end
34
+
35
+ def move_to_next_cur_state(cur_state, previous_states = [], options = {})
36
+ current_node = process_definition.schema.node(cur_state)
37
+ schedulable_nodes = current_node.next_schedulable_nodes(options)
38
+
39
+ if schedulable_nodes.count == 0
40
+ update!(status: :finished, states: [cur_state]) # finish life cycle
41
+ else
42
+ schedulable_nodes.each do |sn|
43
+ execute_single_next_movable_nodes(cur_state, previous_states, sn)
44
+ end
45
+ end
46
+ end
47
+
48
+ def execute_single_next_movable_nodes(cur_state, previous_states, node)
49
+ new_state = node.node_id
50
+
51
+ injected_data = ProcessEngine::NodeDataInjection.node_options_data(process_definition.slug, new_state, self)
52
+
53
+ # check if node can be computed (e.g. script task, or branching node)
54
+ if ProcessEngine::Schema::Node::COMPUTED_NODE_TYPES.include?(node.node_type)
55
+ move_to_next_cur_state(new_state, previous_states + [cur_state], injected_data)
56
+
57
+ elsif node.node_type == ProcessEngine::Schema::Node::NodeType::COMPLEX_GATEWAY
58
+
59
+ unless states.include?(new_state)
60
+ update!(states: (states | [new_state]) - ([cur_state] | previous_states))
61
+ else
62
+ # one state has already been reached, and we just need to move forward
63
+ move_to_next_cur_state(new_state, previous_states + [cur_state], injected_data)
64
+ end
65
+ else
66
+ # this node requires action from user
67
+ ProcessEngine::ProcessTask.spawn_new_task(self, new_state, injected_data)
68
+ update!(states: (states | [new_state]) - ([cur_state] | previous_states))
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,52 @@
1
+ class ProcessEngine::ProcessQuery
2
+ class << self
3
+
4
+ # available options: :finisher, :verified_state, :data
5
+ def task_complete(task_id, options = {})
6
+ task = ProcessEngine::ProcessTask.find(task_id)
7
+ raise ProcessEngine::Error::FalseTaskState if options[:verified_state] && (task.state != options[:verified_state])
8
+
9
+ task.complete(options)
10
+ end
11
+
12
+ def task_get_all(options = {})
13
+ taks = ProcessEngine::ProcessTask.all
14
+
15
+ taks = taks.by_assignee(options[:assignee]) if options[:assignee]
16
+
17
+ taks = taks.by_candidate_user(options[:candidate_user]) if options[:candidate_user]
18
+ taks = taks.by_all_candidate_users(options[:all_candidate_users]) if options[:all_candidate_users]
19
+ taks = taks.by_any_candidate_users(options[:any_candidate_users]) if options[:any_candidate_users]
20
+
21
+ taks = taks.by_candidate_group(options[:candidate_group]) if options[:candidate_group]
22
+ taks = taks.by_all_candidate_groups(options[:all_candidate_groups]) if options[:all_candidate_groups]
23
+ taks = taks.by_any_candidate_groups(options[:any_candidate_groups]) if options[:any_candidate_groups]
24
+
25
+ taks = taks.by_user(options[:user]) if options[:user]
26
+ # e.g. options[:user_or_groups] = ["assignee123", ['cg1']]
27
+ taks = taks.by_user_or_groups(*options[:user_or_groups]) if options[:user_or_groups]
28
+
29
+ taks = taks.by_status(options[:status]) if options[:status]
30
+ taks
31
+ end
32
+
33
+ def task_accessible?(task_id, user, groups = [])
34
+ options = {
35
+ user_or_groups: [user, groups]
36
+ }
37
+
38
+ task_get_all(options).where(id: task_id).count > 0
39
+ end
40
+
41
+ def process_instance_start(process_defintion_slug, creator)
42
+ pd = ProcessEngine::ProcessDefinition.find_by(slug: process_defintion_slug)
43
+ pi = pd.process_instances.create(creator: creator)
44
+ pi.start
45
+ end
46
+
47
+ def process_definition_get_all()
48
+ ProcessEngine::ProcessDefinition.all
49
+ end
50
+
51
+ end
52
+ end
@@ -0,0 +1,30 @@
1
+ class ProcessEngine::ProcessSchema
2
+ attr_reader :nodes
3
+
4
+ def initialize(process_definition)
5
+ nodes_hash = process_definition.bpmn_json.fetch("nodes", [])
6
+ @transitions_hash = process_definition.bpmn_json.fetch("transitions", [])
7
+ initialize_graph(nodes_hash, @transitions_hash)
8
+ end
9
+
10
+ def node(node_id)
11
+ nodes.find { |n| n.node_id == node_id }
12
+ end
13
+
14
+ def nodes_by_type(node_type)
15
+ nodes.select{ |node| node.node_type == node_type }
16
+ end
17
+
18
+ private
19
+
20
+ def initialize_graph(nodes_hash, transitions_hash)
21
+ @nodes = nodes_hash.map{ |node| ProcessEngine::Schema::Node.new(ActiveSupport::HashWithIndifferentAccess.new(node)) }
22
+ transitions_hash.each do |tn|
23
+ source = node(tn["source_ref"]) || (fail "Can't find node #{tn["source_ref"]} in source_ref")
24
+ target = node(tn["target_ref"]) || (fail "Can't find node #{tn["target_ref"]} in target_ref")
25
+ source.transitions << ProcessEngine::Schema::Transition.new(ActiveSupport::HashWithIndifferentAccess.new(tn), source, target)
26
+ end
27
+ end
28
+
29
+
30
+ end
@@ -0,0 +1,70 @@
1
+ module ProcessEngine
2
+ class ProcessTask < ActiveRecord::Base
3
+ enum status: { pending: 0, finished: 1 }
4
+
5
+ belongs_to :process_definition_node
6
+ belongs_to :process_instance
7
+
8
+ # list of operators http://www.postgresql.org/docs/9.4/static/functions-array.html
9
+ scope :by_assignee, -> (assignee) { where(assignee: assignee) }
10
+ scope :by_candidate_user, -> (candidate_user) { where("? = ANY(candidate_users)", candidate_user) }
11
+ scope :by_all_candidate_users, -> (candidate_users) { where("candidate_users @> ARRAY[?]::varchar[]", candidate_users) }
12
+ scope :by_any_candidate_users, -> (candidate_users) { where("candidate_users && ARRAY[?]::varchar[]", candidate_users) }
13
+
14
+ scope :by_candidate_group, -> (candidate_group) { where("? = ANY(candidate_groups)", candidate_group) }
15
+ scope :by_all_candidate_groups, -> (candidate_groups) { where("candidate_groups @> ARRAY[?]::varchar[]", candidate_groups) }
16
+ scope :by_any_candidate_groups, -> (candidate_groups) { where("candidate_groups && ARRAY[?]::varchar[]", candidate_groups) }
17
+
18
+ scope :by_user, -> (user) { where("assignee = ? OR ? = ANY(candidate_users)", user, user) }
19
+ scope :by_user_or_groups, -> (user, groups) { where("assignee = ? OR ? = ANY(candidate_users) OR candidate_groups && ARRAY[?]::varchar[]", user, user, groups) }
20
+
21
+ scope :by_status, -> (status) { where(status: status) }
22
+ scope :by_state, -> (state) { where(state: state) }
23
+
24
+ scope :desc, -> { order('id desc') }
25
+ scope :asc, -> { order('id asc') }
26
+
27
+
28
+ # available options :finisher, :data
29
+ def complete(options)
30
+ injected_data = ProcessEngine::NodeDataInjection.node_options_data(process_instance.process_definition.slug, state, self)
31
+ process_instance.move_to_next_state(state, injected_data)
32
+
33
+ opt = { finisher: options[:finisher], status: :finished }
34
+ opt[:data] = options[:data] if options[:data].present?
35
+
36
+ update!(opt)
37
+
38
+ # enable service hooks
39
+ node_ext = process_instance.process_definition.schema.node(state).node_extension
40
+ ProcessEngine::Listener::Base.execute(process_instance, node_ext.common_execution_listeners, 'end')
41
+ ProcessEngine::Listener::Base.execute(process_instance, node_ext.common_task_listeners, 'complete')
42
+ end
43
+
44
+ def self.spawn_new_task(pi, state, injected_data)
45
+ injected_data ||= {}
46
+ injected_data = ActiveSupport::HashWithIndifferentAccess.new(injected_data)
47
+
48
+ node_ext = pi.process_definition.schema.node(state).node_extension
49
+ assignee = injected_data[:assignee] || node_ext.user_task_assignee
50
+ candidate_users = Array.wrap(injected_data[:candidate_users] || node_ext.user_task_candidate_users)
51
+ candidate_groups = Array.wrap(injected_data[:candidate_groups] || node_ext.user_task_candidate_groups)
52
+
53
+ create! assignee: assignee,
54
+ candidate_users: candidate_users,
55
+ candidate_groups: candidate_groups,
56
+ state: state,
57
+ process_instance_id: pi.id
58
+
59
+ # enable service hooks for "start" & "create" event of execution_listeners & task_listeners
60
+ ProcessEngine::Listener::Base.execute(pi, node_ext.common_execution_listeners, 'start')
61
+ ProcessEngine::Listener::Base.execute(pi, node_ext.common_task_listeners, 'create')
62
+ end
63
+
64
+
65
+ def consumer_task
66
+ ProcessEngine::Consumer::ConsumerTask.new(self)
67
+ end
68
+
69
+ end
70
+ end
@@ -0,0 +1,39 @@
1
+ class ProcessEngine::Schema::Interceptor::ExclusiveGateway
2
+
3
+ attr_reader :node, :options
4
+
5
+ def initialize(node, options)
6
+ @node = node
7
+ @options = options
8
+ end
9
+
10
+ def execute
11
+ # get the next branch from the options implemented
12
+ next_node = target_of_next_sequence_flow(options[:exclusive_gateway_choice_value])
13
+
14
+ # choose the default flow if not implemented
15
+ next_node = choose_default_flow unless next_node
16
+
17
+ return [] unless next_node # the flow get stuck if no implementation given or no default path
18
+ [next_node]
19
+ end
20
+
21
+ def self.execute(node, options)
22
+ new(node, options).execute
23
+ end
24
+
25
+
26
+ private
27
+
28
+ def target_of_next_sequence_flow(value)
29
+ branching_transition_id = node.node_extension.common_properties_kv[value]
30
+ return nil unless branching_transition_id.present?
31
+
32
+ node.transitions.find { |t| t.id == branching_transition_id }.try(:target)
33
+ end
34
+
35
+ def choose_default_flow
36
+ df = node.node_extension.gateway_default_flow
37
+ node.transitions.find { |t| t.id == df }.try(:target)
38
+ end
39
+ end