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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +37 -0
- data/app/assets/bower_components/process_engine/Snap.svg/CONTRIBUTING +3 -0
- data/app/assets/bower_components/process_engine/Snap.svg/Gruntfile.js +59 -0
- data/app/assets/bower_components/process_engine/Snap.svg/LICENSE +202 -0
- data/app/assets/bower_components/process_engine/Snap.svg/NOTICE +190 -0
- data/app/assets/bower_components/process_engine/Snap.svg/README.md +62 -0
- data/app/assets/bower_components/process_engine/Snap.svg/bower.json +25 -0
- data/app/assets/bower_components/process_engine/Snap.svg/component.json +13 -0
- data/app/assets/bower_components/process_engine/Snap.svg/dist/snap.svg-min.js +20 -0
- data/app/assets/bower_components/process_engine/Snap.svg/dist/snap.svg.js +7653 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/css/dr.css +144 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/css/main.css +508 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/css/prism.css +168 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/css/topcoat-desktop-light.css +3700 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.eot +0 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.svg +242 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.ttf +0 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcecodepro-regular-webfont.woff +0 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-light-webfont.eot +0 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-light-webfont.svg +243 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-light-webfont.ttf +0 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-light-webfont.woff +0 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.eot +0 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.svg +243 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.ttf +0 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-regular-webfont.woff +0 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.eot +0 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.svg +243 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.ttf +0 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/sourcesanspro-semibold-webfont.woff +0 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/fonts/stylesheet.css +57 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/img/search.svg +11 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/img/search_dark.svg +16 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/js/prism.js +9 -0
- data/app/assets/bower_components/process_engine/Snap.svg/doc/reference.html +13633 -0
- data/app/assets/bower_components/process_engine/Snap.svg/dr.json +33 -0
- data/app/assets/bower_components/process_engine/Snap.svg/history.md +31 -0
- data/app/assets/bower_components/process_engine/Snap.svg/package.json +22 -0
- data/app/assets/bower_components/process_engine/Snap.svg/template.dot +157 -0
- data/app/assets/bower_components/process_engine/Snap.svg/test.html +75 -0
- data/app/assets/bower_components/process_engine/bpmn-js/LICENSE +22 -0
- data/app/assets/bower_components/process_engine/bpmn-js/README.md +46 -0
- data/app/assets/bower_components/process_engine/bpmn-js/bower.json +28 -0
- data/app/assets/bower_components/process_engine/bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css +40 -0
- data/app/assets/bower_components/process_engine/bpmn-js/dist/assets/bpmn-font/font/bpmn.eot +0 -0
- data/app/assets/bower_components/process_engine/bpmn-js/dist/assets/bpmn-font/font/bpmn.svg +21 -0
- data/app/assets/bower_components/process_engine/bpmn-js/dist/assets/bpmn-font/font/bpmn.ttf +0 -0
- data/app/assets/bower_components/process_engine/bpmn-js/dist/assets/bpmn-font/font/bpmn.woff +0 -0
- data/app/assets/bower_components/process_engine/bpmn-js/dist/assets/diagram-js.css +355 -0
- data/app/assets/bower_components/process_engine/bpmn-js/dist/bpmn-modeler.js +21552 -0
- data/app/assets/bower_components/process_engine/bpmn-js/dist/bpmn-modeler.js.map +1 -0
- data/app/assets/bower_components/process_engine/bpmn-js/dist/bpmn-modeler.min.js +8 -0
- data/app/assets/bower_components/process_engine/bpmn-js/dist/bpmn-navigated-viewer.js +13542 -0
- data/app/assets/bower_components/process_engine/bpmn-js/dist/bpmn-navigated-viewer.js.map +1 -0
- data/app/assets/bower_components/process_engine/bpmn-js/dist/bpmn-navigated-viewer.min.js +5 -0
- data/app/assets/bower_components/process_engine/bpmn-js/dist/bpmn-viewer.js +13294 -0
- data/app/assets/bower_components/process_engine/bpmn-js/dist/bpmn-viewer.js.map +1 -0
- data/app/assets/bower_components/process_engine/bpmn-js/dist/bpmn-viewer.min.js +5 -0
- data/app/assets/bower_components/process_engine/hammerjs/CHANGELOG.md +30 -0
- data/app/assets/bower_components/process_engine/hammerjs/CONTRIBUTING.md +41 -0
- data/app/assets/bower_components/process_engine/hammerjs/Gruntfile.coffee +123 -0
- data/app/assets/bower_components/process_engine/hammerjs/LICENSE.md +21 -0
- data/app/assets/bower_components/process_engine/hammerjs/README.md +6 -0
- data/app/assets/bower_components/process_engine/hammerjs/bower.json +9 -0
- data/app/assets/bower_components/process_engine/hammerjs/component.json +8 -0
- data/app/assets/bower_components/process_engine/hammerjs/hammer.js +2463 -0
- data/app/assets/bower_components/process_engine/hammerjs/hammer.min.js +7 -0
- data/app/assets/bower_components/process_engine/hammerjs/hammer.min.map +1 -0
- data/app/assets/bower_components/process_engine/hammerjs/package.json +50 -0
- data/app/assets/bower_components/process_engine/jquery/MIT-LICENSE.txt +21 -0
- data/app/assets/bower_components/process_engine/jquery/bower.json +27 -0
- data/app/assets/bower_components/process_engine/jquery/dist/jquery.js +9205 -0
- data/app/assets/bower_components/process_engine/jquery/dist/jquery.min.js +5 -0
- data/app/assets/bower_components/process_engine/jquery/dist/jquery.min.map +1 -0
- data/app/assets/bower_components/process_engine/jquery/src/ajax/jsonp.js +89 -0
- data/app/assets/bower_components/process_engine/jquery/src/ajax/load.js +75 -0
- data/app/assets/bower_components/process_engine/jquery/src/ajax/parseJSON.js +13 -0
- data/app/assets/bower_components/process_engine/jquery/src/ajax/parseXML.js +28 -0
- data/app/assets/bower_components/process_engine/jquery/src/ajax/script.js +64 -0
- data/app/assets/bower_components/process_engine/jquery/src/ajax/var/nonce.js +5 -0
- data/app/assets/bower_components/process_engine/jquery/src/ajax/var/rquery.js +3 -0
- data/app/assets/bower_components/process_engine/jquery/src/ajax/xhr.js +136 -0
- data/app/assets/bower_components/process_engine/jquery/src/ajax.js +786 -0
- data/app/assets/bower_components/process_engine/jquery/src/attributes/attr.js +141 -0
- data/app/assets/bower_components/process_engine/jquery/src/attributes/classes.js +158 -0
- data/app/assets/bower_components/process_engine/jquery/src/attributes/prop.js +94 -0
- data/app/assets/bower_components/process_engine/jquery/src/attributes/support.js +35 -0
- data/app/assets/bower_components/process_engine/jquery/src/attributes/val.js +161 -0
- data/app/assets/bower_components/process_engine/jquery/src/attributes.js +11 -0
- data/app/assets/bower_components/process_engine/jquery/src/callbacks.js +205 -0
- data/app/assets/bower_components/process_engine/jquery/src/core/access.js +60 -0
- data/app/assets/bower_components/process_engine/jquery/src/core/init.js +123 -0
- data/app/assets/bower_components/process_engine/jquery/src/core/parseHTML.js +39 -0
- data/app/assets/bower_components/process_engine/jquery/src/core/ready.js +97 -0
- data/app/assets/bower_components/process_engine/jquery/src/core/var/rsingleTag.js +4 -0
- data/app/assets/bower_components/process_engine/jquery/src/core.js +497 -0
- data/app/assets/bower_components/process_engine/jquery/src/css/addGetHookIf.js +22 -0
- data/app/assets/bower_components/process_engine/jquery/src/css/curCSS.js +57 -0
- data/app/assets/bower_components/process_engine/jquery/src/css/defaultDisplay.js +70 -0
- data/app/assets/bower_components/process_engine/jquery/src/css/hiddenVisibleSelectors.js +15 -0
- data/app/assets/bower_components/process_engine/jquery/src/css/support.js +96 -0
- data/app/assets/bower_components/process_engine/jquery/src/css/swap.js +28 -0
- data/app/assets/bower_components/process_engine/jquery/src/css/var/cssExpand.js +3 -0
- data/app/assets/bower_components/process_engine/jquery/src/css/var/getStyles.js +12 -0
- data/app/assets/bower_components/process_engine/jquery/src/css/var/isHidden.js +13 -0
- data/app/assets/bower_components/process_engine/jquery/src/css/var/rmargin.js +3 -0
- data/app/assets/bower_components/process_engine/jquery/src/css/var/rnumnonpx.js +5 -0
- data/app/assets/bower_components/process_engine/jquery/src/css.js +450 -0
- data/app/assets/bower_components/process_engine/jquery/src/data/Data.js +181 -0
- data/app/assets/bower_components/process_engine/jquery/src/data/accepts.js +20 -0
- data/app/assets/bower_components/process_engine/jquery/src/data/var/data_priv.js +5 -0
- data/app/assets/bower_components/process_engine/jquery/src/data/var/data_user.js +5 -0
- data/app/assets/bower_components/process_engine/jquery/src/data.js +178 -0
- data/app/assets/bower_components/process_engine/jquery/src/deferred.js +149 -0
- data/app/assets/bower_components/process_engine/jquery/src/deprecated.js +13 -0
- data/app/assets/bower_components/process_engine/jquery/src/dimensions.js +50 -0
- data/app/assets/bower_components/process_engine/jquery/src/effects/Tween.js +114 -0
- data/app/assets/bower_components/process_engine/jquery/src/effects/animatedSelector.js +13 -0
- data/app/assets/bower_components/process_engine/jquery/src/effects.js +648 -0
- data/app/assets/bower_components/process_engine/jquery/src/event/ajax.js +13 -0
- data/app/assets/bower_components/process_engine/jquery/src/event/alias.js +39 -0
- data/app/assets/bower_components/process_engine/jquery/src/event/support.js +9 -0
- data/app/assets/bower_components/process_engine/jquery/src/event.js +868 -0
- data/app/assets/bower_components/process_engine/jquery/src/exports/amd.js +24 -0
- data/app/assets/bower_components/process_engine/jquery/src/exports/global.js +32 -0
- data/app/assets/bower_components/process_engine/jquery/src/intro.js +44 -0
- data/app/assets/bower_components/process_engine/jquery/src/jquery.js +37 -0
- data/app/assets/bower_components/process_engine/jquery/src/manipulation/_evalUrl.js +18 -0
- data/app/assets/bower_components/process_engine/jquery/src/manipulation/support.js +32 -0
- data/app/assets/bower_components/process_engine/jquery/src/manipulation/var/rcheckableType.js +3 -0
- data/app/assets/bower_components/process_engine/jquery/src/manipulation.js +580 -0
- data/app/assets/bower_components/process_engine/jquery/src/offset.js +207 -0
- data/app/assets/bower_components/process_engine/jquery/src/outro.js +1 -0
- data/app/assets/bower_components/process_engine/jquery/src/queue/delay.js +22 -0
- data/app/assets/bower_components/process_engine/jquery/src/queue.js +142 -0
- data/app/assets/bower_components/process_engine/jquery/src/selector-native.js +172 -0
- data/app/assets/bower_components/process_engine/jquery/src/selector-sizzle.js +14 -0
- data/app/assets/bower_components/process_engine/jquery/src/selector.js +1 -0
- data/app/assets/bower_components/process_engine/jquery/src/serialize.js +111 -0
- data/app/assets/bower_components/process_engine/jquery/src/sizzle/dist/sizzle.js +2067 -0
- data/app/assets/bower_components/process_engine/jquery/src/sizzle/dist/sizzle.min.js +3 -0
- data/app/assets/bower_components/process_engine/jquery/src/sizzle/dist/sizzle.min.map +1 -0
- data/app/assets/bower_components/process_engine/jquery/src/traversing/findFilter.js +100 -0
- data/app/assets/bower_components/process_engine/jquery/src/traversing/var/rneedsContext.js +6 -0
- data/app/assets/bower_components/process_engine/jquery/src/traversing.js +199 -0
- data/app/assets/bower_components/process_engine/jquery/src/var/arr.js +3 -0
- data/app/assets/bower_components/process_engine/jquery/src/var/class2type.js +4 -0
- data/app/assets/bower_components/process_engine/jquery/src/var/concat.js +5 -0
- data/app/assets/bower_components/process_engine/jquery/src/var/hasOwn.js +5 -0
- data/app/assets/bower_components/process_engine/jquery/src/var/indexOf.js +5 -0
- data/app/assets/bower_components/process_engine/jquery/src/var/pnum.js +3 -0
- data/app/assets/bower_components/process_engine/jquery/src/var/push.js +5 -0
- data/app/assets/bower_components/process_engine/jquery/src/var/rnotwhite.js +3 -0
- data/app/assets/bower_components/process_engine/jquery/src/var/slice.js +5 -0
- data/app/assets/bower_components/process_engine/jquery/src/var/strundefined.js +3 -0
- data/app/assets/bower_components/process_engine/jquery/src/var/support.js +4 -0
- data/app/assets/bower_components/process_engine/jquery/src/var/toString.js +5 -0
- data/app/assets/bower_components/process_engine/jquery/src/wrap.js +79 -0
- data/app/assets/bower_components/process_engine/jquery-mousewheel/ChangeLog.md +141 -0
- data/app/assets/bower_components/process_engine/jquery-mousewheel/LICENSE.txt +20 -0
- data/app/assets/bower_components/process_engine/jquery-mousewheel/README.md +85 -0
- data/app/assets/bower_components/process_engine/jquery-mousewheel/bower.json +17 -0
- data/app/assets/bower_components/process_engine/jquery-mousewheel/jquery.mousewheel.js +221 -0
- data/app/assets/bower_components/process_engine/jquery-mousewheel/jquery.mousewheel.min.js +8 -0
- data/app/assets/bower_components/process_engine/lodash/LICENSE.txt +22 -0
- data/app/assets/bower_components/process_engine/lodash/bower.json +23 -0
- data/app/assets/bower_components/process_engine/lodash/dist/lodash.compat.js +7157 -0
- data/app/assets/bower_components/process_engine/lodash/dist/lodash.compat.min.js +61 -0
- data/app/assets/bower_components/process_engine/lodash/dist/lodash.js +6785 -0
- data/app/assets/bower_components/process_engine/lodash/dist/lodash.min.js +56 -0
- data/app/assets/bower_components/process_engine/lodash/dist/lodash.underscore.js +4979 -0
- data/app/assets/bower_components/process_engine/lodash/dist/lodash.underscore.min.js +39 -0
- data/app/assets/bower_components/process_engine/sax/AUTHORS +10 -0
- data/app/assets/bower_components/process_engine/sax/LICENSE +32 -0
- data/app/assets/bower_components/process_engine/sax/LICENSE-W3C.html +188 -0
- data/app/assets/bower_components/process_engine/sax/README.md +216 -0
- data/app/assets/bower_components/process_engine/sax/component.json +12 -0
- data/app/assets/bower_components/process_engine/sax/examples/big-not-pretty.xml +8002 -0
- data/app/assets/bower_components/process_engine/sax/examples/example.js +29 -0
- data/app/assets/bower_components/process_engine/sax/examples/get-products.js +58 -0
- data/app/assets/bower_components/process_engine/sax/examples/hello-world.js +4 -0
- data/app/assets/bower_components/process_engine/sax/examples/not-pretty.xml +8 -0
- data/app/assets/bower_components/process_engine/sax/examples/pretty-print.js +74 -0
- data/app/assets/bower_components/process_engine/sax/examples/shopping.xml +2 -0
- data/app/assets/bower_components/process_engine/sax/examples/strict.dtd +870 -0
- data/app/assets/bower_components/process_engine/sax/examples/test.html +15 -0
- data/app/assets/bower_components/process_engine/sax/examples/test.xml +1254 -0
- data/app/assets/bower_components/process_engine/sax/lib/sax.js +1410 -0
- data/app/assets/bower_components/process_engine/sax/package.json +12 -0
- data/app/assets/bower_components/process_engine/sax/test/attribute-name.js +33 -0
- data/app/assets/bower_components/process_engine/sax/test/attribute-no-space.js +75 -0
- data/app/assets/bower_components/process_engine/sax/test/buffer-overrun.js +26 -0
- data/app/assets/bower_components/process_engine/sax/test/case.js +50 -0
- data/app/assets/bower_components/process_engine/sax/test/cdata-chunked.js +11 -0
- data/app/assets/bower_components/process_engine/sax/test/cdata-end-split.js +15 -0
- data/app/assets/bower_components/process_engine/sax/test/cdata-fake-end.js +28 -0
- data/app/assets/bower_components/process_engine/sax/test/cdata-multiple.js +15 -0
- data/app/assets/bower_components/process_engine/sax/test/cdata.js +10 -0
- data/app/assets/bower_components/process_engine/sax/test/cyrillic.js +8 -0
- data/app/assets/bower_components/process_engine/sax/test/duplicate-attribute.js +13 -0
- data/app/assets/bower_components/process_engine/sax/test/emoji.js +12 -0
- data/app/assets/bower_components/process_engine/sax/test/end_empty_stream.js +5 -0
- data/app/assets/bower_components/process_engine/sax/test/entities.js +10 -0
- data/app/assets/bower_components/process_engine/sax/test/entity-mega.js +16 -0
- data/app/assets/bower_components/process_engine/sax/test/flush.js +13 -0
- data/app/assets/bower_components/process_engine/sax/test/index.js +86 -0
- data/app/assets/bower_components/process_engine/sax/test/issue-23.js +43 -0
- data/app/assets/bower_components/process_engine/sax/test/issue-30.js +24 -0
- data/app/assets/bower_components/process_engine/sax/test/issue-35.js +15 -0
- data/app/assets/bower_components/process_engine/sax/test/issue-47.js +12 -0
- data/app/assets/bower_components/process_engine/sax/test/issue-49.js +31 -0
- data/app/assets/bower_components/process_engine/sax/test/issue-84.js +13 -0
- data/app/assets/bower_components/process_engine/sax/test/parser-position.js +28 -0
- data/app/assets/bower_components/process_engine/sax/test/script-close-better.js +12 -0
- data/app/assets/bower_components/process_engine/sax/test/script.js +12 -0
- data/app/assets/bower_components/process_engine/sax/test/self-closing-child-strict.js +44 -0
- data/app/assets/bower_components/process_engine/sax/test/self-closing-child.js +44 -0
- data/app/assets/bower_components/process_engine/sax/test/self-closing-tag.js +25 -0
- data/app/assets/bower_components/process_engine/sax/test/stray-ending.js +17 -0
- data/app/assets/bower_components/process_engine/sax/test/trailing-attribute-no-value.js +10 -0
- data/app/assets/bower_components/process_engine/sax/test/trailing-non-whitespace.js +18 -0
- data/app/assets/bower_components/process_engine/sax/test/unclosed-root.js +11 -0
- data/app/assets/bower_components/process_engine/sax/test/unquoted.js +18 -0
- data/app/assets/bower_components/process_engine/sax/test/utf8-split.js +32 -0
- data/app/assets/bower_components/process_engine/sax/test/xmlns-as-tag-name.js +15 -0
- data/app/assets/bower_components/process_engine/sax/test/xmlns-issue-41.js +68 -0
- data/app/assets/bower_components/process_engine/sax/test/xmlns-rebinding.js +63 -0
- data/app/assets/bower_components/process_engine/sax/test/xmlns-strict.js +74 -0
- data/app/assets/bower_components/process_engine/sax/test/xmlns-unbound-element.js +33 -0
- data/app/assets/bower_components/process_engine/sax/test/xmlns-unbound.js +15 -0
- data/app/assets/bower_components/process_engine/sax/test/xmlns-xml-default-ns.js +31 -0
- data/app/assets/bower_components/process_engine/sax/test/xmlns-xml-default-prefix-attribute.js +36 -0
- data/app/assets/bower_components/process_engine/sax/test/xmlns-xml-default-prefix.js +21 -0
- data/app/assets/bower_components/process_engine/sax/test/xmlns-xml-default-redefine.js +41 -0
- data/app/assets/javascripts/process_engine/application.js +65 -0
- data/app/assets/stylesheets/process_engine/application.css +39 -0
- data/app/controllers/process_engine/application_controller.rb +28 -0
- data/app/controllers/process_engine/process_definitions_controller.rb +63 -0
- data/app/controllers/process_engine/process_instances_controller.rb +42 -0
- data/app/controllers/process_engine/process_tasks_controller.rb +23 -0
- data/app/helpers/process_engine/application_helper.rb +4 -0
- data/app/models/process_engine/consumer/consumer_task.rb +15 -0
- data/app/models/process_engine/error/false_task_state.rb +2 -0
- data/app/models/process_engine/listener/base.rb +49 -0
- data/app/models/process_engine/node_data_injection.rb +22 -0
- data/app/models/process_engine/parser/complex_gateway.rb +21 -0
- data/app/models/process_engine/parser/end_event.rb +23 -0
- data/app/models/process_engine/parser/exclusive_gateway.rb +25 -0
- data/app/models/process_engine/parser/extension/condition_expression.rb +39 -0
- data/app/models/process_engine/parser/extension/execution_listener.rb +15 -0
- data/app/models/process_engine/parser/extension/form_field.rb +50 -0
- data/app/models/process_engine/parser/extension/input_output.rb +28 -0
- data/app/models/process_engine/parser/extension/listener.rb +43 -0
- data/app/models/process_engine/parser/extension/property.rb +20 -0
- data/app/models/process_engine/parser/extension/task_listener.rb +15 -0
- data/app/models/process_engine/parser/extension/transitional_parameter.rb +53 -0
- data/app/models/process_engine/parser/inclusive_gateway.rb +25 -0
- data/app/models/process_engine/parser/parallel_gateway.rb +19 -0
- data/app/models/process_engine/parser/script_task.rb +37 -0
- data/app/models/process_engine/parser/sequence_flow.rb +36 -0
- data/app/models/process_engine/parser/start_event.rb +27 -0
- data/app/models/process_engine/parser/user_task.rb +36 -0
- data/app/models/process_engine/parser/xml_node.rb +125 -0
- data/app/models/process_engine/process_definition.rb +50 -0
- data/app/models/process_engine/process_instance.rb +72 -0
- data/app/models/process_engine/process_query.rb +52 -0
- data/app/models/process_engine/process_schema.rb +30 -0
- data/app/models/process_engine/process_task.rb +70 -0
- data/app/models/process_engine/schema/interceptor/exclusive_gateway.rb +39 -0
- data/app/models/process_engine/schema/node.rb +48 -0
- data/app/models/process_engine/schema/node_extension.rb +79 -0
- data/app/models/process_engine/schema/transition.rb +22 -0
- data/app/views/layouts/process_engine/application.html.erb +14 -0
- data/app/views/process_engine/layouts/_menu.html.haml +6 -0
- data/app/views/process_engine/layouts/application.html.haml +11 -0
- data/app/views/process_engine/process_definitions/_form.html.haml +6 -0
- data/app/views/process_engine/process_definitions/edit.html.haml +3 -0
- data/app/views/process_engine/process_definitions/index.html.haml +26 -0
- data/app/views/process_engine/process_definitions/new.html.haml +3 -0
- data/app/views/process_engine/process_definitions/show.html.haml +51 -0
- data/app/views/process_engine/process_instances/_form.html.haml +5 -0
- data/app/views/process_engine/process_instances/edit.html.haml +3 -0
- data/app/views/process_engine/process_instances/index.html.haml +29 -0
- data/app/views/process_engine/process_instances/show.html.haml +38 -0
- data/app/views/process_engine/process_tasks/index.html.haml +44 -0
- data/app/views/process_engine/share/_bpmn_canvas.html.haml +7 -0
- data/config/initializers/bower_rails.rb +16 -0
- data/config/initializers/simple_form.rb +166 -0
- data/config/initializers/simple_form_bootstrap.rb +135 -0
- data/config/locales/simple_form.en.yml +31 -0
- data/config/routes.rb +18 -0
- data/db/migrate/20150313063311_create_process_engine_process_definitions.rb +14 -0
- data/db/migrate/20150313063508_create_process_engine_process_instances.rb +15 -0
- data/db/migrate/20150313063633_create_process_engine_process_tasks.rb +30 -0
- data/lib/process_engine/engine.rb +12 -0
- data/lib/process_engine/version.rb +3 -0
- data/lib/process_engine.rb +8 -0
- data/lib/tasks/process_engine_tasks.rake +4 -0
- data/lib/templates/erb/scaffold/_form.html.erb +13 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +29 -0
- data/test/dummy/config/application.rb +26 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +85 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +41 -0
- data/test/dummy/config/environments/production.rb +79 -0
- data/test/dummy/config/environments/test.rb +42 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +4 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/db/schema.rb +66 -0
- data/test/dummy/log/development.log +9722 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/8afee1847b645742b0d2535a7c32f4f22e7926ec/bootstrap.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/b5911aa594334efca1023d6f01abce0758e9648a/bootstrap.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/014d8413350c7d85a5429f5e2c9ac911 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/0cbd667d0fbf9e0e6f60b5ebf2f95fa3 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/0f7ba040a442530a6d4a5bc8307769c1 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/0fca2cc9aa38138660d8c7d492cf81e4 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/0ff24903c54f534941fbc96ff862e475 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/11100f87277a2892323fe5581af75a7b +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/18a34084783e8b7f9bc871bc64b13eed +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/1a3821ce28e0196075ed0830fcb45f38 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/1cf94b9a49ee68cb0f4065d48e9cbaf3 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/21a6373d6c40614fd05be57194c68248 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/26276ae8df51c046f3adc0b50a1521ba +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/2eea4a8f4854d438cd03cb23a89b6d8c +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/3993bcd8bae4771e550d8fc91d1debbc +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/3ccc4edae36a9c4bd70fc330c9c83dc9 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/3e391b0f37505fffc40ba9ffa13330a2 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/42e258b77f5dd532dfb9344a2d766de6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/43a5910cb7a330ece5856c0e9099efa2 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/4e65ec1149f01e749e1e372861210d4d +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/501160bcee63ae68449a5a5eb78b6d41 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/517beb0bf366ec3c8649da9ac8a8a01e +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/525a556b1eaacfa041722e1250d9859a +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/56edbae38e4e0ff9f4b4fc576ae3d746 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/5b04f4a7058d92f88f89f2248bcc16b0 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/5c3c69f7c2520b57620931c150032d7e +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/5d1f8f2111e14084ebf711412c9230d2 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/5f9833d6835900c56d0e76a1b2924cc2 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/67c653cc36eb639f7a7af5159e9f9de3 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/704b33432a5ba417bcd5962ad999c671 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/7301f83e8e67f30be13546a794a553ef +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/7482c8f712712a79937caf41413bca15 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/761cb171e67ddca71e8b9c74f0220457 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/7e23bd4385e166267961b6d936363042 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/7e5100f290c9ba0d4c026e43b58d0d79 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/80743880e8d46958e9839ff9408c3113 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/8b8941aae968854bafb4638a86cad77b +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/9c292f3b6b577a92970303c351e1d4a1 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/a3435b13cfa60fb7469a19703350bda7 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/a6ce1b2837383f1e8b62b7f1ddcc6820 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/a7e90acc68ba69b7cd5c0a7005467c4b +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/be4d00fb7bf467b370f0fda7e453ec68 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/c4fbf44e63e40cbbf825fe750374728f +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/c593bacb8d3f003125f91763a7b36b10 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/c5ae3bc69f7b1e1fdb51a667c9f3cdd6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/cc843b336460771bf75c97cf0935301b +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/ce3b6127737ed36f7b62a54acec06b3e +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/d58931b13c55c146d21475e532b126ba +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/dc6bbdc1e385c7bb2743011e9c2a7407 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/dd7270e11b484ae10f601e1dd014445a +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/de86beefc60e0cd84dd1525af863e64d +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/e0953e6e4a6c208e350f7f25d85bdce8 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/ec3b479833be43bf164a3deb119c3aee +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/ef2cb0afc9a61a3d5819b4dfc84720ad +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f0511bbd6f6cd5530acddebb6d7e7044 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f7009bba030498129042e0c542d4f264 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/test/fixtures/process_engine/process_definitions.yml +17 -0
- data/test/fixtures/process_engine/process_instances.yml +11 -0
- data/test/fixtures/process_engine/process_tasks.yml +11 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/models/process_engine/process_definition_test.rb +9 -0
- data/test/models/process_engine/process_instance_test.rb +9 -0
- data/test/models/process_engine/process_task_test.rb +9 -0
- data/test/process_engine_test.rb +7 -0
- data/test/test_helper.rb +19 -0
- 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
|