├── LICENSE ├── README.md └── scripting-snippets.md /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 DigitalState 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # awesome-camunda 2 | A curated list of awesome Camunda BPM projects, libraries, tools, documentation, forum posts, etc. 3 | 4 | :exclamation: See something missing, an error, an improvement? Please contribute with Pull Requests! 5 | 6 | # Official Github Accounts 7 | 8 | 1. [Main Camunda Repo](https://github.com/camunda) - The main repo for Camunda 9 | 1. [BPMN.io](https://github.com/bpmn-io) - BPMN, DMN, and CMMN Javascript Renderers and Editors by Camunda. 10 | 1. [Camunda Consulting Repository](https://github.com/camunda-consulting) 11 | 1. [Camunda-CI](https://github.com/camunda-ci) - Repository used by Camunda for CI Builds. 12 | 1. [Third Party Repos](https://github.com/camunda-third-party) - Contains forks of thrid party libraries and tools used by camunda projects. 13 | 1. [Camunda Jenkins](https://github.com/camunda-jenkins) - Github user for Camunda internal Jenkins usage. 14 | 1. [Camunda Internal](https://github.com/camunda-internal) - Repos used by Camunda for internal purposes. 15 | 1. [Zeebe](https://github.com/zeebe-io) - The main repo for Zeebe; Distributed Workflow Engine for Microservices Orchestration, by Camunda. 16 | 17 | # Tools and libraries 18 | 19 | 1. [BPMN to PNG/PDF](https://github.com/bpmn-io/bpmn-to-image) - Convert BPMN 2.0 diagrams to PDF documents or PNG files. 20 | 1. [DMN Check](https://github.com/red6/dmn-check) - A Maven plugin which performs various static analyses on Decision Model Notation (DMN) files to detect bugs. 21 | 1. [vPAV](https://github.com/viadee/vPAV) - A tool that checks Camunda projects for consistency and discovers errors in process-driven applications, inconsistencies of a given BPMN model in the classpath and the sourcecode of an underlying java project, such as a delegate reference to a non-existing java class or a non-existing Spring bean. 22 | 1. https://github.com/plexiti/camunda-bpm-spock 23 | 1. https://github.com/StephenOTT/ProcessProjectTemplate 24 | 1. https://github.com/DigitalState/Camunda-Spock-Testing 25 | 1. https://github.com/StephenOTT/vertx-bpmn-model-doc-generator 26 | 1. https://github.com/livetocode/camunda-prometheus-exporter 27 | 1. https://github.com/camunda-consulting/camunda-util-demo-data-generator 28 | 1. https://forum.camunda.org/t/camunda-to-asciidoctor-documentation-generator/6580 https://github.com/GeekMustHave/Camunda-ADOC-Viewer https://github.com/GeekMustHave/Camunda-ASCIIDoc-Generator 29 | 1. [MacOS Homebrew Cask for Camunda Modeler](https://github.com/Homebrew/homebrew-cask/blob/master/Casks/camunda-modeler.rb) - `brew install camunda-modeler` 30 | 1. Unit Testing Coverage 31 | 32 | # Load Testing / Performance Testing 33 | 34 | 1. https://github.com/camunda/camunda-bpm-platform/tree/master/qa/performance-tests-engine 35 | 1. https://camunda.com/products/performance/ 36 | 1. https://blog.camunda.com/post/2014/01/benchmarking-camunda-process-engine/ 37 | 1. https://www.slideshare.net/camunda/2015-0113-performance-en 38 | 39 | # Notable forum.camunda.org Threads and Posts 40 | 41 | ## Tasklist Forms 42 | 1. React 43 | 1. Angular Forms 44 | 1. Formio and Formio Form Builder: https://forum.camunda.org/t/form-builder-drag-and-drop-form-server-validations/1092 + More links 45 | 1. External Libraries 46 | 1. Google Maps 47 | 48 | 49 | ## Scripting 50 | 51 | :exclamation: [Helpful Scripting Snippets](./scripting-snippets.md) 52 | 53 | 1. Variable Encryption: https://github.com/StephenOTT/camunda-data-encryption-rsa 54 | 1. Multi-Instance Mapping 55 | 1. Nashorn Engine 56 | 1. Printing to Console 57 | 58 | ## OAuth / SSO 59 | 60 | 1. https://forum.camunda.org/t/single-sign-on-in-camunda/291 61 | 62 | ## JSON Usage 63 | 64 | 1. SPIN vs JS Script Mirror 65 | 66 | # GraphQL 67 | 68 | 1. https://github.com/Loydl/camunda-graphql-client-example 69 | 1. https://github.com/Loydl/camunda-graphql-tasklist 70 | 1. https://github.com/Loydl/camunda-graphql-client-example 71 | 1. GraphQL API: https://forum.camunda.org/t/developing-the-camunda-graphql-extension/2872/35 72 | 1. https://github.com/camunda/camunda-bpm-graphql 73 | 74 | # Camunda Modeler Plugins 75 | 76 | 1. https://github.com/umb/camunda-modeler-property-info-plugin 77 | 1. https://github.com/camunda/camunda-modeler-plugins 78 | 1. https://github.com/StephenOTT/camunda-vertx-springboot 79 | 80 | # BPM Engine Plugins 81 | 82 | 1. [Custom Batch](https://github.com/camunda/camunda-bpm-custom-batch) - A plugin to provide a simple way of using the Camunda Batch functionality. 83 | 1. Form JS Validation https://github.com/StephenOTT/camunda-form-validator-js-server 84 | 1. Vertx https://github.com/StephenOTT/camunda-vertx-plugin 85 | 1. https://github.com/DigitalState/camunda-administrative-user-plugin 86 | 1. https://github.com/StephenOTT/camunda-incident-handler-nashorn-js 87 | 1. JWT Provider: https://github.com/Loydl/camunda-jwt-provider 88 | 89 | 90 | 91 | 92 | # Clustering 93 | 94 | 1. Shared Engine Deployment Aware 95 | 1. 96 | 97 | # Use Cases / Showcases 98 | 99 | 1. ... 100 | 101 | # Community Blog Posts 102 | 103 | 1. https://blog.camunda.com/post/2018/07/camunda-days-nyc-goldman-sachs-workflow-platform/ 104 | 1. https://blog.camunda.com/post/2018/06/camunda-Tasklist-privacy/ 105 | 1. https://blog.camunda.com/post/2018/05/camunda-AWS-Rekognition/ 106 | 1. https://blog.camunda.com/post/2016/05/citizen-identity-enrolment/ 107 | 1. https://blog.bernd-ruecker.com/orchestrating-azure-functions-using-bpmn-and-camunda-a-case-study-ff71264cfad6 108 | 1. https://blog.bernd-ruecker.com/@berndruecker 109 | 110 | 111 | # Camunda Web App Plugins (Admin, Cockpit, Tasklist) 112 | 113 | 114 | 115 | # Common Questions 116 | 117 | 1. Shared Engine vs ... 118 | 1. Extending the Camunda Rest API 119 | 1. Clustering 120 | 1. Kubernetes 121 | 1. Docker 122 | 1. Secrets Management 123 | 1. HTTP-Connector 124 | 1. 4000 Character limit on text/Strings 125 | 1. Business Key usage 126 | 1. List of All Camunda Listeners 127 | 128 | 129 | 130 | # Old Content 131 | 132 | 1. https://github.com/plexiti/camunda-grails-plugin (Grails 2 only, Camunda 7.3.x) 133 | 134 | 135 | 136 | # Notable Users to Follow 137 | 138 | ## BPMN/DMN/CMMN JS / Camunda Modeler 139 | 140 | 1. https://github.com/philippfromme 141 | 142 | ## Camunda Engine 143 | 144 | 1. https://github.com/meyerdan 145 | 1. https://github.com/hawky-4s- 146 | 1. https://github.com/yanavasileva 147 | 1. https://github.com/koevskinikola 148 | 1. https://github.com/berndruecker 149 | 150 | 151 | ## Community 152 | 153 | 1. https://github.com/jangalinski 154 | 1. https://github.com/Loydl (Graph QL) 155 | 156 | 157 | 158 | 159 | # Community Groups 160 | 161 | 1. [Meetups](https://camunda.com/events/meetups/) - Meetup groups for Camunda 162 | 1. [Vienna Camunda Meetup Group](http://www.meetup.com/camunda-vienna) - [Github Organization] 163 | (https://github.com/camunda-vienna) 164 | 1. .. 165 | 166 | 167 | 168 | # Zeebe 169 | 170 | 171 | # Cawemo 172 | 173 | # Camunda Optimize 174 | 175 | 176 | 177 | # Camunda In the News 178 | 179 | 1. https://www.mwdadvisors.com/2017/06/27/camunda-cawemo-optimize/ 180 | 1. https://www.bp-3.com/blog/sandy-kemsley-on-camunda-bpm-7-5-release/ 181 | 1. https://www.bp-3.com/blog/bpmn-io-bpmn-everywhere-for-everyone/ 182 | 183 | 184 | 185 | # Camunda comparisons to other projects/products 186 | 187 | Listing of known project/product comparisons. 188 | 189 | 1. Activity... 190 | 1. flowable... 191 | 1. Jboss BPM... 192 | 1. etc... 193 | 1. https://blog.camunda.com/post/2016/10/camunda-engine-since-activiti-fork/ 194 | 1. https://forum.camunda.org/t/strengths-of-camunda-vs-flowable/2842 195 | 196 | 197 | 198 | # Training Material 199 | 200 | Various Training materials, Videos, links, etc 201 | 202 | 1. [Camunda Videos](https://www.youtube.com/user/camundaVideo) - Official Camunda YouTube channel with various training videos 203 | 1. [Throwing BPMN Errors with Javascript](https://medium.com/@stephenrussett/throwing-bpmn-errors-with-javascript-in-camunda-c678f4b7d9ff) - Medium.com post by @StephenOTT (2016) 204 | 1. [Deploying Embedded Forms with Rest API](https://medium.com/@stephenrussett/deploying-embedded-forms-with-camunda-rest-api-84cf8010f8c1) - Medium.com post by @StephenOTT (2016) 205 | 1. [Deploying External Scripts with Rest API](https://medium.com/@stephenrussett/deploying-external-scripts-with-camunda-rest-api-e06bd90a2931) - Medium.com post by @StephenOTT (2016) 206 | 1. ... 207 | 208 | 209 | # Frequently used JavaDoc references 210 | 211 | 1. [Process Engine Services](https://docs.camunda.org/javadoc/camunda-bpm-platform/7.9/org/camunda/bpm/engine/ProcessEngineServices.html) - Main Interface JavaDoc page for Process Engine Services. Most commonly used page when navigating the Engine's services 212 | 1. ... -------------------------------------------------------------------------------- /scripting-snippets.md: -------------------------------------------------------------------------------- 1 | # Scripting Snippets 2 | 3 | 4 | ## Load Config.json into memory and into a Process Variable(optional) 5 | 6 | Provides the ability to load into memory a json file stored as a Resource in the process deployment, and then process the json into Process Variables. 7 | 8 | ### Javascript 9 | 10 | ```javascript 11 | /** 12 | * Load configuration file as a SPIN JSON variable in-memory and optionally as a process variable. 13 | * 14 | * @param string fileName The name of the configuration file in the deployment. 15 | * @param string key The top level JSON key in the configuration file that will be saved, and other keys/objects are omitted. 16 | * @param boolean persist Whether to save the configuration as a process variable. 17 | * @return SPIN JSON Object 18 | */ 19 | function loadConfig(fileName, key, persist) 20 | { 21 | 'use strict'; 22 | 23 | if (typeof(persist) == 'undefined') { 24 | persist = false; 25 | } 26 | 27 | if (typeof(key) == 'undefined') { 28 | key = null; 29 | } 30 | 31 | var processDefinitionId = execution.getProcessDefinitionId(); 32 | var deploymentId = execution.getProcessEngineServices().getRepositoryService().getProcessDefinition(processDefinitionId).getDeploymentId(); 33 | var resource = execution.getProcessEngineServices().getRepositoryService().getResourceAsStream(deploymentId, fileName); 34 | 35 | var Scanner = Java.type('java.util.Scanner'); 36 | 37 | var scannerResource = new Scanner(resource, 'UTF-8'); 38 | 39 | var configText = scannerResource.useDelimiter('\\Z').next(); 40 | scannerResource.close(); 41 | 42 | var configAsJson = S(configText); 43 | 44 | if (key === null) { 45 | var config = configAsJson; 46 | } else { 47 | if (!configAsJson.hasProp(key)) { 48 | throw 'Key "' + key + '" does not exist.'; 49 | } 50 | var config = configAsJson.prop(key); 51 | } 52 | 53 | if (persist) { 54 | execution.setVariable('_config', config); 55 | } 56 | 57 | return config; 58 | } 59 | 60 | loadConfig('config.json', 'myProcess', true); 61 | // loadConfig('config.json'); 62 | // loadConfig('config.json', null, true); 63 | // loadConfig('config.json', null, false); 64 | // loadConfig('config.json', 'myprocess'); 65 | // loadConfig('config.json', 'myprocess', true); 66 | // loadConfig('config.json', 'myprocess', false); 67 | 68 | ``` 69 | 70 | 71 | ## Render FreeMarker template into memory 72 | 73 | Camunda has a 4000 character limit of string variables that are stored in the database. This creates a issue when trying to process FreeMarker templates: specifically when using a Script Task with a script type of "freemarker" the result variable will be stored as a Process Variable. For templates that are larger than 4000 characters, this will cause a error in the process. The workaround for this issue is to execute the freemarker engine in memory/in-scripting. This snippet provides a easy to use pattern for executing the freemarker template engine in memory and getting the result in memory, allowing you to save the variable in the desired format (such as a SPIN JSON variable or Java Object, which does not have the 4000 character limit). 74 | 75 | ### Javascript 76 | 77 | ```javascript 78 | /** 79 | * Evaluate/Render a FreeMarker template 80 | * 81 | * @param string content The string content of a FreeMarker template. 82 | * @param string object The KeyValue object/JSON object for placeholder bindings. 83 | * @return string The rendered FreeMarker template. 84 | */ 85 | function renderFreeMarkerTemplate(content, placeholderValues) 86 | { 87 | // 'use strict' cannot be used at a global script level because JavaImporter's with(){} does not support it. 88 | 89 | var ScriptEngine = new JavaImporter(javax.script); 90 | 91 | with (ScriptEngine) { 92 | var manager = new ScriptEngineManager(); 93 | var engine = manager.getEngineByName('freemarker'); 94 | 95 | var bindings = engine.createBindings(); 96 | bindings.put('placeholders', placeholderValues); 97 | 98 | var rendered = engine.eval(content, bindings); 99 | 100 | return rendered; 101 | } 102 | } 103 | 104 | var placeholderValues = { 105 | "firstName": "John", 106 | "lastName": "Smith" 107 | } 108 | 109 | var renderedTemplate = renderFreeMarkerTemplate(content, placeholderValues); 110 | // renderedTemplate.toString(); 111 | ``` 112 | 113 | where `content` is the string content of a FreeMarker template file. 114 | 115 | FreeMarker Template 116 | 117 | ``` 118 | This is a sample FreeMarker template file. 119 | My First Name: ${placeholders.firstName} 120 | My Last Name: ${placeholders.lastName} 121 | ``` 122 | 123 | 124 | ## Add Camunda Extension properties using Camunda Model Fluent API 125 | 126 | ### Groovy 127 | 128 | ```Groovy 129 | private CamundaProperties createCamundaProperties(BpmnModelInstance bpmnModelInstance, Map properties) { 130 | CamundaProperties camundaProperties = bpmnModelInstance.newInstance(CamundaProperties.class) 131 | properties.each { 132 | camundaProperties.addChildElement(addCamundaProperty(camundaProperties, it.getKey(), it.getValue())) 133 | } 134 | return camundaProperties 135 | } 136 | 137 | private CamundaProperty addCamundaProperty(CamundaProperties properties, String key, String value){ 138 | CamundaProperty property = properties.getModelInstance().newInstance(CamundaProperty.class) 139 | property.setCamundaName(key) 140 | property.setCamundaValue(value) 141 | return property 142 | } 143 | 144 | BpmnModelInstance addCamundaProperties(BpmnModelInstance bpmnModelInstance, List elementIds, Map properties ){ 145 | elementIds.each { elementId -> 146 | ModelElementInstance instance = bpmnModelInstance.getModelElementById(elementId) 147 | try { 148 | CamundaProperties camundaProperties = createCamundaProperties(bpmnModelInstance,properties) 149 | instance.builder().addExtensionElement(camundaProperties) 150 | } catch (all){ 151 | throw new Exception("Cant add extension to Element: ${elementId}. Error: ${all}") 152 | } 153 | } 154 | 155 | return bpmnModelInstance 156 | } 157 | 158 | ``` 159 | 160 | Usage Example: 161 | 162 | ```groovy 163 | BpmnModelInstance model3() { 164 | 165 | BpmnModelInstance model = Bpmn.createExecutableProcess('model') 166 | .name("Reminder Demo") 167 | .startEvent('someStartEvent') 168 | .userTask('readEmail') 169 | .boundaryEvent('killusertask') 170 | .timerWithDuration("PT1H") 171 | .cancelActivity(true) 172 | .moveToActivity('readEmail') 173 | .boundaryEvent() 174 | .timerWithCycle("R3/PT10M") 175 | .cancelActivity(false) 176 | .serviceTask() 177 | .name('reminderSent') 178 | .implementation('expression') 179 | .camundaExpression('${1+1}') 180 | .endEvent() 181 | .moveToActivity('readEmail') 182 | .manualTask('manual1').name('do something') 183 | .moveToNode('killusertask').connectTo('manual1') 184 | //.moveToActivity('killusertask').connectTo('manual1') This does not work. Must use the moveToNode() 185 | .manualTask('manual2').name('do something else') 186 | .endEvent() 187 | .done() 188 | model = addCamundaProperties(model, 189 | ['model','someStartEvent','killusertask', 'readEmail'], 190 | ['prop1':'value1', 'prop2':'value2']) 191 | return model 192 | } 193 | ``` 194 | 195 | This will add the `prop1:value1, prop2:value2` properties to the following elements: `['model','someStartEvent','killusertask', 'readEmail']`. Note the `model` element, which is the actual BPMN Definition within the BPMN Model; this allows you to add properties to the BPMN model it self and not just BPMN activities. --------------------------------------------------------------------------------