From 6a94b0761475db9a93e1cf9464a1dac8251d3df9 Mon Sep 17 00:00:00 2001 From: Maciej Swiderski Date: Wed, 15 Feb 2017 15:01:34 +0100 Subject: [PATCH] JBPM-5681 - DMN support for BusinessRuleTask (#548) --- .../designer/bpmn2/BpmnMarshallerHelper.java | 3 + .../bpmn2/impl/Bpmn2JsonMarshaller.java | 10 + .../bpmn2/impl/Bpmn2JsonUnmarshaller.java | 12 + .../bpmn2/validation/BPMN2SyntaxChecker.java | 58 +++- .../bpmn2/validation/SyntaxCheckerErrors.java | 2 + .../bpmn2/impl/Bpmn2JsonMarshallerTest.java | 10 + .../bpmn2/impl/Bpmn2UnmarshallingTest.java | 12 + .../validation/BPMN2SyntaxCheckerTest.java | 17 ++ .../designer/bpmn2/impl/dmnBusinessRule.bpmn2 | 78 +++++ .../designer/bpmn2/impl/dmnBusinessRule.json | 288 ++++++++++++++++++ .../bpmn2/validation/dmnBusinessRule.bpmn2 | 78 +++++ .../validation/emptyDmnBusinessRule.bpmn2 | 60 ++++ .../bpmn2.0jbpm/stencildata/bpmn2.0jbpm.orig | 23 ++ 13 files changed, 639 insertions(+), 12 deletions(-) create mode 100644 jbpm-designer-backend/src/test/resources/org/jbpm/designer/bpmn2/impl/dmnBusinessRule.bpmn2 create mode 100644 jbpm-designer-backend/src/test/resources/org/jbpm/designer/bpmn2/impl/dmnBusinessRule.json create mode 100644 jbpm-designer-backend/src/test/resources/org/jbpm/designer/bpmn2/validation/dmnBusinessRule.bpmn2 create mode 100644 jbpm-designer-backend/src/test/resources/org/jbpm/designer/bpmn2/validation/emptyDmnBusinessRule.bpmn2 diff --git a/jbpm-designer-backend/src/main/java/org/jbpm/designer/bpmn2/BpmnMarshallerHelper.java b/jbpm-designer-backend/src/main/java/org/jbpm/designer/bpmn2/BpmnMarshallerHelper.java index 245861dcbd..3b5e679d3d 100644 --- a/jbpm-designer-backend/src/main/java/org/jbpm/designer/bpmn2/BpmnMarshallerHelper.java +++ b/jbpm-designer-backend/src/main/java/org/jbpm/designer/bpmn2/BpmnMarshallerHelper.java @@ -26,6 +26,9 @@ * */ public interface BpmnMarshallerHelper { + + public static final String RULE_LANG_DRL = "DRL"; + public static final String RULE_LANG_DMN = "DMN"; /** * Applies the set of properties from the json model to the BPMN 2 element. diff --git a/jbpm-designer-backend/src/main/java/org/jbpm/designer/bpmn2/impl/Bpmn2JsonMarshaller.java b/jbpm-designer-backend/src/main/java/org/jbpm/designer/bpmn2/impl/Bpmn2JsonMarshaller.java index 228377ab9e..43fe4359b8 100644 --- a/jbpm-designer-backend/src/main/java/org/jbpm/designer/bpmn2/impl/Bpmn2JsonMarshaller.java +++ b/jbpm-designer-backend/src/main/java/org/jbpm/designer/bpmn2/impl/Bpmn2JsonMarshaller.java @@ -26,7 +26,9 @@ import bpsim.impl.BpsimPackageImpl; import org.eclipse.emf.common.util.EList; import org.jboss.drools.*; +import org.jbpm.designer.bpmn2.BpmnMarshallerHelper; import org.jbpm.designer.util.Utils; +import org.jbpm.workflow.core.node.RuleSetNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.codehaus.jackson.JsonEncoding; @@ -1124,6 +1126,14 @@ protected void marshallTask(Task task, BPMNPlane plane, JsonGenerator generator, properties.put("ruleflowgroup", entry.getValue()); } } + String ruleLanguage = ((BusinessRuleTask) task).getImplementation(); + if (RuleSetNode.DMN_LANG.equals(ruleLanguage)) { + ruleLanguage = BpmnMarshallerHelper.RULE_LANG_DMN; + } else { + ruleLanguage = BpmnMarshallerHelper.RULE_LANG_DRL; + } + properties.put("rulelanguage", ruleLanguage); + } else if (task instanceof ScriptTask) { ScriptTask scriptTask = (ScriptTask) task; properties.put("script", scriptTask.getScript() != null ? scriptTask.getScript().replace("\\", "\\\\").replace("\n", "\\n") : ""); diff --git a/jbpm-designer-backend/src/main/java/org/jbpm/designer/bpmn2/impl/Bpmn2JsonUnmarshaller.java b/jbpm-designer-backend/src/main/java/org/jbpm/designer/bpmn2/impl/Bpmn2JsonUnmarshaller.java index df22022fcb..ff969fc548 100644 --- a/jbpm-designer-backend/src/main/java/org/jbpm/designer/bpmn2/impl/Bpmn2JsonUnmarshaller.java +++ b/jbpm-designer-backend/src/main/java/org/jbpm/designer/bpmn2/impl/Bpmn2JsonUnmarshaller.java @@ -74,6 +74,7 @@ import org.jbpm.designer.bpmn2.resource.JBPMBpmn2ResourceFactoryImpl; import org.jbpm.designer.bpmn2.util.DIZorderComparator; import org.jbpm.designer.util.Utils; +import org.jbpm.workflow.core.node.RuleSetNode; import org.osgi.framework.BundleContext; import org.osgi.framework.BundleReference; import org.osgi.framework.InvalidSyntaxException; @@ -4787,6 +4788,17 @@ protected void applyBusinessRuleTaskProperties(BusinessRuleTask task, Map 0) { + String ruleLanguage = properties.get("rulelanguage"); + if (BpmnMarshallerHelper.RULE_LANG_DMN.equals(ruleLanguage)) { + task.setImplementation(RuleSetNode.DMN_LANG); + } else { + task.setImplementation(RuleSetNode.DRL_LANG); + } + } else { + task.setImplementation(RuleSetNode.DRL_LANG); + } } protected void applyScriptTaskProperties(ScriptTask scriptTask, Map properties) { diff --git a/jbpm-designer-backend/src/main/java/org/jbpm/designer/bpmn2/validation/BPMN2SyntaxChecker.java b/jbpm-designer-backend/src/main/java/org/jbpm/designer/bpmn2/validation/BPMN2SyntaxChecker.java index 7aa346578d..72445787c7 100644 --- a/jbpm-designer-backend/src/main/java/org/jbpm/designer/bpmn2/validation/BPMN2SyntaxChecker.java +++ b/jbpm-designer-backend/src/main/java/org/jbpm/designer/bpmn2/validation/BPMN2SyntaxChecker.java @@ -35,9 +35,11 @@ import org.jbpm.bpmn2.xml.BPMNDISemanticModule; import org.jbpm.bpmn2.xml.BPMNSemanticModule; import org.jbpm.compiler.xml.XmlProcessReader; +import org.jbpm.designer.bpmn2.BpmnMarshallerHelper; import org.jbpm.designer.web.profile.IDiagramProfile; import org.jbpm.process.core.validation.ProcessValidationError; import org.jbpm.ruleflow.core.validation.RuleFlowProcessValidator; +import org.jbpm.workflow.core.node.RuleSetNode; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -322,20 +324,52 @@ private void checkFlowNode(FlowNode flowNode, FlowElementsContainer container, P } private void checkBusinessRuleTask(BusinessRuleTask businessRuleTask) { - Iterator biter = businessRuleTask.getAnyAttribute().iterator(); - boolean foundRuleflowGroup = false; - while(biter.hasNext()) { - FeatureMap.Entry entry = biter.next(); - if(entry.getEStructuralFeature().getName().equals("ruleFlowGroup")) { - foundRuleflowGroup = true; - String ruleflowGroup = (String) entry.getValue(); - if(isEmpty(ruleflowGroup)) { - addError(businessRuleTask, new ValidationSyntaxError(businessRuleTask, BPMN2_TYPE, SyntaxCheckerErrors.BUSINESS_RULE_TASK_NO_RULEFLOW_GROUP)); + String ruleLanguage = businessRuleTask.getImplementation(); + if (RuleSetNode.DMN_LANG.equals(ruleLanguage)) { + ruleLanguage = BpmnMarshallerHelper.RULE_LANG_DMN; + } else { + ruleLanguage = BpmnMarshallerHelper.RULE_LANG_DRL; + } + if (ruleLanguage.equals(BpmnMarshallerHelper.RULE_LANG_DRL)) { + Iterator biter = businessRuleTask.getAnyAttribute().iterator(); + boolean foundRuleflowGroup = false; + while (biter.hasNext()) { + FeatureMap.Entry entry = biter.next(); + if (entry.getEStructuralFeature().getName().equals("ruleFlowGroup")) { + foundRuleflowGroup = true; + String ruleflowGroup = (String) entry.getValue(); + if (isEmpty(ruleflowGroup)) { + addError(businessRuleTask, new ValidationSyntaxError(businessRuleTask, BPMN2_TYPE, SyntaxCheckerErrors.BUSINESS_RULE_TASK_NO_RULEFLOW_GROUP)); + } } } - } - if(!foundRuleflowGroup) { - addError(businessRuleTask, new ValidationSyntaxError(businessRuleTask, BPMN2_TYPE, SyntaxCheckerErrors.BUSINESS_RULE_TASK_NO_RULEFLOW_GROUP)); + if (!foundRuleflowGroup) { + addError(businessRuleTask, new ValidationSyntaxError(businessRuleTask, BPMN2_TYPE, SyntaxCheckerErrors.BUSINESS_RULE_TASK_NO_RULEFLOW_GROUP)); + } + } else if (ruleLanguage.equals(BpmnMarshallerHelper.RULE_LANG_DMN)) { + boolean missingNamespace = true; + boolean missingModel = true; + if (businessRuleTask.getIoSpecification() != null) { + List dataInputs = businessRuleTask.getIoSpecification().getDataInputs(); + + if (dataInputs != null) { + for (DataInput di : dataInputs) { + if ("namespace".equals(di.getName())) { + missingNamespace = false; + } else if ("model".equals(di.getName())) { + missingModel = false; + } + + } + } + } + if (missingNamespace) { + addError(businessRuleTask, new ValidationSyntaxError(businessRuleTask, BPMN2_TYPE, SyntaxCheckerErrors.DMN_BUSINESS_RULE_TASK_NO_NAMESPACE)); + } + if (missingModel) { + addError(businessRuleTask, new ValidationSyntaxError(businessRuleTask, BPMN2_TYPE, SyntaxCheckerErrors.DMN_BUSINESS_RULE_TASK_NO_MODEL)); + } + } } diff --git a/jbpm-designer-backend/src/main/java/org/jbpm/designer/bpmn2/validation/SyntaxCheckerErrors.java b/jbpm-designer-backend/src/main/java/org/jbpm/designer/bpmn2/validation/SyntaxCheckerErrors.java index a85c276b7e..0face9dda0 100644 --- a/jbpm-designer-backend/src/main/java/org/jbpm/designer/bpmn2/validation/SyntaxCheckerErrors.java +++ b/jbpm-designer-backend/src/main/java/org/jbpm/designer/bpmn2/validation/SyntaxCheckerErrors.java @@ -3,6 +3,8 @@ public class SyntaxCheckerErrors { public static final String AT_LEAST_ONE_OUTGOING_PROBABILITY_VALUE_100 = "At least one outgoing connection should have probability equal to 100."; public static final String BUSINESS_RULE_TASK_NO_RULEFLOW_GROUP = "Business Rule Task has no ruleflow-group."; + public static final String DMN_BUSINESS_RULE_TASK_NO_NAMESPACE = "DMN Business Rule Task has no namespace set."; + public static final String DMN_BUSINESS_RULE_TASK_NO_MODEL = "DMN Business Rule Task has no model set."; public static final String COST_PER_TIME_UNIT_MUST_BE_POSITIVE = "Cost per Time Unit value must be positive."; public static final String END_NODE_NO_INCOMING_CONNECTIONS = "End node has no incoming connections"; public static final String EVENT_HAS_NO_ERROR_REF = " Event has no errorref."; diff --git a/jbpm-designer-backend/src/test/java/org/jbpm/designer/bpmn2/impl/Bpmn2JsonMarshallerTest.java b/jbpm-designer-backend/src/test/java/org/jbpm/designer/bpmn2/impl/Bpmn2JsonMarshallerTest.java index 379025e679..1bf54152a9 100644 --- a/jbpm-designer-backend/src/test/java/org/jbpm/designer/bpmn2/impl/Bpmn2JsonMarshallerTest.java +++ b/jbpm-designer-backend/src/test/java/org/jbpm/designer/bpmn2/impl/Bpmn2JsonMarshallerTest.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.List; +import org.jbpm.designer.bpmn2.BpmnMarshallerHelper; import org.jbpm.designer.bpmn2.impl.helpers.SimpleEdge; import org.jbpm.designer.bpmn2.utils.Bpmn2Loader; import org.jbpm.designer.bpmn2.validation.BPMN2SyntaxCheckerTest; @@ -446,6 +447,7 @@ public void testBusinessRuleTask() throws Exception { JSONObject properties = ruleTask.getJSONObject("properties"); assertEquals("simpleGroup", properties.getString("ruleflowgroup")); assertEquals(true, properties.getBoolean("isasync")); + assertEquals(BpmnMarshallerHelper.RULE_LANG_DRL, properties.getString("rulelanguage")); } @Test @@ -566,4 +568,12 @@ public void testAdHocSubprocessDroolsCompletionCondition() throws Exception { assertEquals("drools", scriptLanguage); } + @Test + public void testDMNBusinessRuleTask() throws Exception { + JSONObject process = loader.loadProcessFromXml("dmnBusinessRule.bpmn2"); + JSONObject ruleTask = getChildByName(process, "test"); + JSONObject properties = ruleTask.getJSONObject("properties"); + assertEquals(BpmnMarshallerHelper.RULE_LANG_DMN, properties.getString("rulelanguage")); + } + } diff --git a/jbpm-designer-backend/src/test/java/org/jbpm/designer/bpmn2/impl/Bpmn2UnmarshallingTest.java b/jbpm-designer-backend/src/test/java/org/jbpm/designer/bpmn2/impl/Bpmn2UnmarshallingTest.java index 329e195b4a..d3234aa85e 100644 --- a/jbpm-designer-backend/src/test/java/org/jbpm/designer/bpmn2/impl/Bpmn2UnmarshallingTest.java +++ b/jbpm-designer-backend/src/test/java/org/jbpm/designer/bpmn2/impl/Bpmn2UnmarshallingTest.java @@ -35,6 +35,7 @@ import org.jboss.drools.impl.MetaDataTypeImpl; import org.jbpm.designer.bpmn2.impl.helpers.SimpleEdge; import org.jbpm.designer.bpmn2.utils.Bpmn2Loader; +import org.jbpm.workflow.core.node.RuleSetNode; import org.junit.Test; import static org.jbpm.designer.bpmn2.impl.helpers.SimpleEdge.*; @@ -205,6 +206,7 @@ public void testBusinessRuleTask() throws Exception { BusinessRuleTask ruleTask = (BusinessRuleTask) task; verifyAttribute(ruleTask, "ruleFlowGroup", "simpleGroup"); assertEquals("", getMetaDataValue(task.getExtensionValues(), "customAsync")); + assertEquals(RuleSetNode.DRL_LANG, ruleTask.getImplementation()); } @Test @@ -1692,6 +1694,16 @@ public void testAdHocSubprocessDroolsCompletionCondition() throws Exception { assertEquals("http://www.jboss.org/drools/rule", expression.getLanguage()); } + @Test + public void testDMNBusinessRuleTask() throws Exception { + Definitions definitions = loader.loadProcessFromJson("dmnBusinessRule.json"); + Process process = getRootProcess(definitions); + FlowElement task = getFlowElement(process.getFlowElements(), "test"); + assertTrue(task instanceof BusinessRuleTask); + BusinessRuleTask ruleTask = (BusinessRuleTask) task; + assertEquals(RuleSetNode.DMN_LANG, ruleTask.getImplementation()); + } + public void testInputOutputSetsOfIoSpecification() throws Exception { Definitions definitions = loader.loadProcessFromJson("taskIoSpecification.json"); Process process = getRootProcess(definitions); diff --git a/jbpm-designer-backend/src/test/java/org/jbpm/designer/bpmn2/validation/BPMN2SyntaxCheckerTest.java b/jbpm-designer-backend/src/test/java/org/jbpm/designer/bpmn2/validation/BPMN2SyntaxCheckerTest.java index 42064f93a2..9a358a1d11 100644 --- a/jbpm-designer-backend/src/test/java/org/jbpm/designer/bpmn2/validation/BPMN2SyntaxCheckerTest.java +++ b/jbpm-designer-backend/src/test/java/org/jbpm/designer/bpmn2/validation/BPMN2SyntaxCheckerTest.java @@ -306,6 +306,23 @@ public void testMultipleSubprocessStartEvents() throws Exception { verifyErrorsOfElement(syntaxChecker, subProcess, Arrays.asList(SyntaxCheckerErrors.MULTIPLE_START_EVENTS)); } + @Test + public void testEmptyDMNBusinessRule() throws Exception { + JSONObject process = loader.loadProcessFromXml("emptyDmnBusinessRule.bpmn2", BPMN2SyntaxCheckerTest.class); + JSONObject ruleTask = loader.getChildByName(process, "test"); + String processJson = loader.getProcessJson(); + BPMN2SyntaxChecker syntaxChecker = new BPMN2SyntaxChecker(processJson, "", loader.getProfile()); + verifyErrorsOfElement(syntaxChecker, ruleTask, Arrays.asList(SyntaxCheckerErrors.DMN_BUSINESS_RULE_TASK_NO_NAMESPACE, SyntaxCheckerErrors.DMN_BUSINESS_RULE_TASK_NO_MODEL)); + } + + @Test + public void testDMNBusinessRule() throws Exception { + loader.loadProcessFromXml("dmnBusinessRule.bpmn2"); + String processJson = loader.getProcessJson(); + BPMN2SyntaxChecker syntaxChecker = new BPMN2SyntaxChecker(processJson, "", loader.getProfile()); + verifyNoErrors(syntaxChecker); + } + private void verifyNoErrors(SyntaxChecker syntaxChecker) throws Exception { syntaxChecker.checkSyntax(); assertFalse(syntaxChecker.errorsFound()); diff --git a/jbpm-designer-backend/src/test/resources/org/jbpm/designer/bpmn2/impl/dmnBusinessRule.bpmn2 b/jbpm-designer-backend/src/test/resources/org/jbpm/designer/bpmn2/impl/dmnBusinessRule.bpmn2 new file mode 100644 index 0000000000..6591623b9d --- /dev/null +++ b/jbpm-designer-backend/src/test/resources/org/jbpm/designer/bpmn2/impl/dmnBusinessRule.bpmn2 @@ -0,0 +1,78 @@ + + + + + + + + + + + + _D5C0FB17-AC8C-4BCF-BD69-9F973B581836 + + + + + + + + _D5C0FB17-AC8C-4BCF-BD69-9F973B581836 + _F083F326-63AB-49F5-BC23-C412BA817441 + + + + + _17AA6636-67D4-4AB8-B995-54C8E5997061_namespaceInputX + _17AA6636-67D4-4AB8-B995-54C8E5997061_modelInputX + + + + + _17AA6636-67D4-4AB8-B995-54C8E5997061_namespaceInputX + + dmn-namespace + _17AA6636-67D4-4AB8-B995-54C8E5997061_namespaceInputX + + + + _17AA6636-67D4-4AB8-B995-54C8E5997061_modelInputX + + mymodel + _17AA6636-67D4-4AB8-B995-54C8E5997061_modelInputX + + + + + + + + + + + _F083F326-63AB-49F5-BC23-C412BA817441 + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jbpm-designer-backend/src/test/resources/org/jbpm/designer/bpmn2/impl/dmnBusinessRule.json b/jbpm-designer-backend/src/test/resources/org/jbpm/designer/bpmn2/impl/dmnBusinessRule.json new file mode 100644 index 0000000000..4a53ad9dfc --- /dev/null +++ b/jbpm-designer-backend/src/test/resources/org/jbpm/designer/bpmn2/impl/dmnBusinessRule.json @@ -0,0 +1,288 @@ +{ + "resourceId": "_rC8ecfILEealZIUu-TmO8g", + "properties": { + "name": "", + "namespaces": "", + "expressionlanguage": "http://www.mvel.org/2.0", + "executable": "true", + "package": "org.jbpm", + "vardefs": "", + "customdescription": "", + "customcaseidprefix": "", + "customcaseroles": "", + "adhocprocess": "false", + "imports": "", + "globals": "", + "id": "evaluation.ruletest", + "version": "1.0", + "timeunit": "min", + "currency": "", + "targetnamespace": "http://www.omg.org/bpmn20", + "typelanguage": "http://www.java.com/javaTypes", + "processn": "ruletest", + "documentation": "" + }, + "stencil": {"id": "BPMNDiagram"}, + "childShapes": [ + { + "resourceId": "processStartEvent", + "properties": { + "name": "", + "documentation": "", + "isselectable": "true", + "invisid": "", + "dataoutputassociations": "", + "dataoutputassociationsview": "", + "dataoutput": "", + "min": "5.0", + "max": "10.0", + "standarddeviation": "1", + "mean": "0", + "distributiontype": "uniform", + "probability": "100.0", + "isinterrupting": "true", + "bgcolor": "#9acd32", + "bordercolor": "#000000", + "fontcolor": "#000000", + "fontsize": "", + "origbgcolor": "#9acd32", + "origbordercolor": "#000000" + }, + "stencil": {"id": "StartNoneEvent"}, + "childShapes": [], + "outgoing": [{"resourceId": "_D5C0FB17-AC8C-4BCF-BD69-9F973B581836"}], + "bounds": { + "lowerRight": { + "x": 150, + "y": 195 + }, + "upperLeft": { + "x": 120, + "y": 165 + } + }, + "dockers": [] + }, + { + "resourceId": "_17AA6636-67D4-4AB8-B995-54C8E5997061", + "properties": { + "model": "mymodel", + "namespace": "dmn-namespace", + "name": "test", + "documentation": "", + "isselectable": "true", + "invisid": "", + "isforcompensation": "", + "assignments": "[din]namespace=dmn-namespace,[din]model=mymodel", + "assignmentsview": "", + "tasktype": "Business Rule", + "messageref": "", + "script": "", + "script_language": "java", + "bgcolor": "#fafad2", + "bordercolor": "#000000", + "fontcolor": "#000000", + "fontsize": "", + "datainputset": "namespace:String,model:String", + "dataoutputset": "", + "origbgcolor": "#fafad2", + "nomorph": "true", + "origbordercolor": "#000000", + "ruleflowgroup": "", + "rulelanguage": "DMN", + "onentryactions": "", + "onexitactions": "", + "isasync": "false", + "customautostart": "false", + "taskname": "", + "serviceoperation": "", + "serviceinterface": "", + "serviceimplementation": "Java", + "actors": "", + "groupid": "", + "subject": "", + "description": "", + "content": "", + "reassignment": "", + "notifications": "", + "locale": "", + "createdby": "", + "skippable": "true", + "priority": "", + "multipleinstance": "false", + "multipleinstancecollectioninput": "", + "multipleinstancecollectionoutput": "", + "multipleinstancedatainput": "", + "multipleinstancedataoutput": "", + "multipleinstancecompletioncondition": "", + "min": "5.0", + "max": "10.0", + "standarddeviation": "1", + "mean": "0", + "distributiontype": "uniform", + "quantity": "1", + "workinghours": "8", + "unitcost": "0.0" + }, + "stencil": {"id": "Task"}, + "childShapes": [], + "outgoing": [{"resourceId": "_F083F326-63AB-49F5-BC23-C412BA817441"}], + "bounds": { + "lowerRight": { + "x": 295, + "y": 220 + }, + "upperLeft": { + "x": 195, + "y": 140 + } + }, + "dockers": [] + }, + { + "resourceId": "_D5C0FB17-AC8C-4BCF-BD69-9F973B581836", + "properties": { + "name": "", + "documentation": "", + "isselectable": "true", + "invisid": "", + "conditiontype": "None", + "conditionexpression": "", + "conditionexpressionlanguage": "java", + "priority": "", + "probability": "100.0", + "isimmediate": "false", + "showdiamondmarker": "", + "bgcolor": "#000000", + "origbgcolor": "#000000", + "bordercolor": "#000000", + "origbordercolor": "#000000", + "fontcolor": "#000000", + "fontsize": "" + }, + "stencil": {"id": "SequenceFlow"}, + "childShapes": [], + "outgoing": [{"resourceId": "_17AA6636-67D4-4AB8-B995-54C8E5997061"}], + "bounds": { + "lowerRight": { + "x": 194.15625, + "y": 180 + }, + "upperLeft": { + "x": 150.609375, + "y": 180 + } + }, + "dockers": [ + { + "x": 15, + "y": 15 + }, + { + "x": 50, + "y": 40 + } + ], + "target": {"resourceId": "_17AA6636-67D4-4AB8-B995-54C8E5997061"} + }, + { + "resourceId": "_BABAFC71-44A6-4480-9143-7DA25C4C17CF", + "properties": { + "name": "", + "documentation": "", + "isselectable": "true", + "invisid": "", + "eventdefinitions": "", + "datainputassociations": "", + "datainputassociationsview": "", + "datainput": "", + "min": "5.0", + "max": "10.0", + "standarddeviation": "1", + "mean": "0", + "distributiontype": "uniform", + "bgcolor": "#ff6347", + "bordercolor": "#000000", + "fontcolor": "#000000", + "fontsize": "", + "origbgcolor": "#ff6347", + "origbordercolor": "#000000" + }, + "stencil": {"id": "EndNoneEvent"}, + "childShapes": [], + "outgoing": [], + "bounds": { + "lowerRight": { + "x": 373, + "y": 194 + }, + "upperLeft": { + "x": 345, + "y": 166 + } + }, + "dockers": [] + }, + { + "resourceId": "_F083F326-63AB-49F5-BC23-C412BA817441", + "properties": { + "name": "", + "documentation": "", + "isselectable": "true", + "invisid": "", + "conditiontype": "None", + "conditionexpression": "", + "conditionexpressionlanguage": "java", + "priority": "", + "probability": "100.0", + "isimmediate": "false", + "showdiamondmarker": "", + "bgcolor": "#000000", + "origbgcolor": "#000000", + "bordercolor": "#000000", + "origbordercolor": "#000000", + "fontcolor": "#000000", + "fontsize": "" + }, + "stencil": {"id": "SequenceFlow"}, + "childShapes": [], + "outgoing": [{"resourceId": "_BABAFC71-44A6-4480-9143-7DA25C4C17CF"}], + "bounds": { + "lowerRight": { + "x": 344.640625, + "y": 180 + }, + "upperLeft": { + "x": 295.875, + "y": 180 + } + }, + "dockers": [ + { + "x": 50, + "y": 40 + }, + { + "x": 14, + "y": 14 + } + ], + "target": {"resourceId": "_BABAFC71-44A6-4480-9143-7DA25C4C17CF"} + } + ], + "bounds": { + "lowerRight": { + "x": 3000, + "y": 2000 + }, + "upperLeft": { + "x": 0, + "y": 0 + } + }, + "stencilset": { + "url": "/org.kie.workbench.KIEWebapp/stencilsets/bpmn2.0jbpm/bpmn2.0jbpm.json", + "namespace": "http://b3mn.org/stencilset/bpmn2.0#" + }, + "ssextensions": [] +} \ No newline at end of file diff --git a/jbpm-designer-backend/src/test/resources/org/jbpm/designer/bpmn2/validation/dmnBusinessRule.bpmn2 b/jbpm-designer-backend/src/test/resources/org/jbpm/designer/bpmn2/validation/dmnBusinessRule.bpmn2 new file mode 100644 index 0000000000..6591623b9d --- /dev/null +++ b/jbpm-designer-backend/src/test/resources/org/jbpm/designer/bpmn2/validation/dmnBusinessRule.bpmn2 @@ -0,0 +1,78 @@ + + + + + + + + + + + + _D5C0FB17-AC8C-4BCF-BD69-9F973B581836 + + + + + + + + _D5C0FB17-AC8C-4BCF-BD69-9F973B581836 + _F083F326-63AB-49F5-BC23-C412BA817441 + + + + + _17AA6636-67D4-4AB8-B995-54C8E5997061_namespaceInputX + _17AA6636-67D4-4AB8-B995-54C8E5997061_modelInputX + + + + + _17AA6636-67D4-4AB8-B995-54C8E5997061_namespaceInputX + + dmn-namespace + _17AA6636-67D4-4AB8-B995-54C8E5997061_namespaceInputX + + + + _17AA6636-67D4-4AB8-B995-54C8E5997061_modelInputX + + mymodel + _17AA6636-67D4-4AB8-B995-54C8E5997061_modelInputX + + + + + + + + + + + _F083F326-63AB-49F5-BC23-C412BA817441 + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jbpm-designer-backend/src/test/resources/org/jbpm/designer/bpmn2/validation/emptyDmnBusinessRule.bpmn2 b/jbpm-designer-backend/src/test/resources/org/jbpm/designer/bpmn2/validation/emptyDmnBusinessRule.bpmn2 new file mode 100644 index 0000000000..690a5a2f4c --- /dev/null +++ b/jbpm-designer-backend/src/test/resources/org/jbpm/designer/bpmn2/validation/emptyDmnBusinessRule.bpmn2 @@ -0,0 +1,60 @@ + + + + + + + + + + + + _D5C0FB17-AC8C-4BCF-BD69-9F973B581836 + + + + + + + + _D5C0FB17-AC8C-4BCF-BD69-9F973B581836 + _F083F326-63AB-49F5-BC23-C412BA817441 + + + + + + + + + + + + + + _F083F326-63AB-49F5-BC23-C412BA817441 + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jbpm-designer-client/src/main/resources/org/jbpm/designer/public/stencilsets/bpmn2.0jbpm/stencildata/bpmn2.0jbpm.orig b/jbpm-designer-client/src/main/resources/org/jbpm/designer/public/stencilsets/bpmn2.0jbpm/stencildata/bpmn2.0jbpm.orig index ddbac3dbbd..782319fa25 100644 --- a/jbpm-designer-client/src/main/resources/org/jbpm/designer/public/stencilsets/bpmn2.0jbpm/stencildata/bpmn2.0jbpm.orig +++ b/jbpm-designer-client/src/main/resources/org/jbpm/designer/public/stencilsets/bpmn2.0jbpm/stencildata/bpmn2.0jbpm.orig @@ -2707,6 +2707,29 @@ "optional":true, "fortasktypes":"None|Business Rule" }, + { + "id":"rulelanguage", + "type":"Choice", + "title":"Rule Language", + "value":"DRL", + "description":"Defines the rule language.", + "description_ja":"", + "readonly":false, + "optional":true, + "fortasktypes":"None|Business Rule", + "items": [ + { + "id": "c1", + "title":"DRL", + "value":"DRL" + }, + { + "id": "c2", + "title": "DMN", + "value": "DMN" + } + ] + }, { "id":"onEntryActions", "type":"Expression",