From 409379ba6ca9f9016f4f1136f4036ece825b1fbe Mon Sep 17 00:00:00 2001 From: Mike Dalessio <mike.dalessio@gmail.com> Date: Sat, 8 Nov 2014 23:14:42 -0500 Subject: [PATCH 1/7] Added a test case for #1155. --- test/files/namespace_pressure_test.xml | 1684 +++++++++++++++++ .../test_namespaces_in_parsed_doc.rb | 14 + 2 files changed, 1698 insertions(+) create mode 100644 test/files/namespace_pressure_test.xml diff --git a/test/files/namespace_pressure_test.xml b/test/files/namespace_pressure_test.xml new file mode 100644 index 00000000000..81ee0b2628a --- /dev/null +++ b/test/files/namespace_pressure_test.xml @@ -0,0 +1,1684 @@ +<?xml version="1.0" encoding="UTF-8"?> +<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.omg.org/bpmn20" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:drools="http://www.jboss.org/drools" id="_40lQMS73EeS1AYtvYpBbmA" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd http://www.jboss.org/drools drools.xsd" targetNamespace="http://www.omg.org/bpmn20"> + <bpmn2:itemDefinition id="__7A0D6B74-FB75-4981-B072-0A5131A2CE6E_toInputItem" structureRef="String"/> + <bpmn2:itemDefinition id="__7A0D6B74-FB75-4981-B072-0A5131A2CE6E_subjectInputItem" structureRef="String"/> + <bpmn2:itemDefinition id="__7A0D6B74-FB75-4981-B072-0A5131A2CE6E_bodyInputItem" structureRef="String"/> + <bpmn2:itemDefinition id="__AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_SensorIDInputItem" structureRef="Integer"/> + <bpmn2:itemDefinition id="__AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_OwnerIDInputItem" structureRef="Integer"/> + <bpmn2:itemDefinition id="__AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_SensorTimestampOutputItem" structureRef="String"/> + <bpmn2:itemDefinition id="__AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_SensorDataOutputItem" structureRef="String"/> + <bpmn2:itemDefinition id="__AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_LocationValidOutputItem" structureRef="String"/> + <bpmn2:itemDefinition id="__AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_LocationTimestampOutputItem" structureRef="String"/> + <bpmn2:itemDefinition id="__AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_LocationLatitudeOutputItem" structureRef="Float"/> + <bpmn2:itemDefinition id="__AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_LocationLongitudeOutputItem" structureRef="Float"/> + <bpmn2:itemDefinition id="__AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_LocationAccuracyOutputItem" structureRef="String"/> + <bpmn2:itemDefinition id="__AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_SensorIDOutputItem" structureRef="Integer"/> + <bpmn2:itemDefinition id="__AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_OwnerIDOutputItem" structureRef="String"/> + <bpmn2:process id="53cd4af1e4b0207100d2266e" name="Mail Test" isExecutable="true"> + <bpmn2:extensionElements> + <drools:global identifier="defectid" type="Integer"/> + <drools:metadata> + <drools:metaentry> + <drools:name>id</drools:name> + <drools:value>53cd4af1e4b0207100d2266e</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>targetnamespace</drools:name> + <drools:value>http://www.omg.org/bpmn20</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>resourceId</drools:name> + <drools:value>53cd4af1e4b0207100d2266e</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>typelanguage</drools:name> + <drools:value>http://www.w3.org/2001/XMLSchema</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>expressionlanguage</drools:name> + <drools:value>http://www.w3.org/1999/XPath</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>adhocprocess</drools:name> + <drools:value>false</drools:value> + </drools:metaentry> + </drools:metadata> + </bpmn2:extensionElements> + <bpmn2:startEvent id="_E70CB5E9-B76F-42ED-9950-F140E90F1103" drools:bgcolor="#9acd32" drools:selectable="true" name=""> + <bpmn2:outgoing>_05393109-B58E-44C3-8BF2-00C4B2421310</bpmn2:outgoing> + </bpmn2:startEvent> + <bpmn2:sequenceFlow id="_A3BF1D3B-BA14-4641-A17E-124082F0B197" drools:bgcolor="#000000" drools:selectable="true" drools:probability1="100" drools:probability2="100" drools:repetition1="100" drools:repetition2="100" sourceRef="_3627B530-52F6-4EFC-B9D1-FC3D28F7BC13" targetRef="_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE"/> + <bpmn2:sequenceFlow id="_D0127BEA-43BE-4405-9CA6-1BB7B13A77D4" drools:bgcolor="#000000" drools:selectable="true" drools:probability1="100" drools:probability2="100" drools:repetition1="100" drools:repetition2="100" sourceRef="_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE" targetRef="_7A0D6B74-FB75-4981-B072-0A5131A2CE6E"/> + <bpmn2:task id="_7A0D6B74-FB75-4981-B072-0A5131A2CE6E" drools:selectable="true" drools:taskName="externalManufacturingTask" name="Deliver Mail"> + <bpmn2:extensionElements> + <drools:metadata> + <drools:metaentry> + <drools:name>tasktype</drools:name> + <drools:value>externalManufacturingTask</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>script_language</drools:name> + <drools:value>javascript</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>fontcolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>bgcolor</drools:name> + <drools:value>#fafad2</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>bordercolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>resourceId</drools:name> + <drools:value>_7A0D6B74-FB75-4981-B072-0A5131A2CE6E</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>name</drools:name> + <drools:value>Deliver Mail</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>avg_time</drools:name> + <drools:value>1m</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>isselectable</drools:name> + <drools:value>true</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>asdomain</drools:name> + <drools:value>63.9 - Other information service activities</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>origbordercolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>min_time</drools:name> + <drools:value>1m</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>origbgcolor</drools:name> + <drools:value>#fafad2</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>assignments</drools:name> + <drools:value>to=juergen.mangler@univie.ac.at,subject=Defect Part,body=data.defectid</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>typeproc</drools:name> + <drools:value>63.99 - Other information service activities n.e.c.</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>company</drools:name> + <drools:value><![CDATA[[{ +"serviceId": "138", +"serviceLabel": "Manual Labor", +"serviceEndpoint": "xmpp-r://adventure_gateway_mail@fp7-adventure.eu", +"orgName": "Mail CO", +"profileId": "64", +"serviceOperation": "43", +"serviceOperationLabel": "mail", +"dataInputs": +[{ +"name": "to", +"standardType": "String"}, +{ +"name": "subject", +"standardType": "String"}, +{ +"name": "body", +"standardType": "String"}] +, +"order": "1", +"serviceOperations": +[{ +"initData": { +"OperationId": "43", +"InterfaceId": "74", +"Name": "mail", +"Description": "null", +"Method": "PULL", +"Attachments": "null", +"OperationParameters": +[{ +"initData": { +"Id": "82", +"OperationId": "43", +"ParameterId": "90", +"Type": "INPUT", +"Parameter": { +"initData": { +"ParameterId": "90", +"Name": "to", +"Description": "null", +"DataType": "STRING", +"SpecificationUrl": "null", +"Attachments": "null", +"ParameterClassifications": +[] +}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns00019781845762014694http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns00019781845762014694http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}, +{ +"initData": { +"Id": "83", +"OperationId": "43", +"ParameterId": "91", +"Type": "INPUT", +"Parameter": { +"initData": { +"ParameterId": "91", +"Name": "subject", +"Description": "null", +"DataType": "STRING", +"SpecificationUrl": "null", +"Attachments": "null", +"ParameterClassifications": +[] +}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns00019781845762014694http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns00019781845762014694http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}, +{ +"initData": { +"Id": "84", +"OperationId": "43", +"ParameterId": "92", +"Type": "INPUT", +"Parameter": { +"initData": { +"ParameterId": "92", +"Name": "body", +"Description": "null", +"DataType": "STRING", +"SpecificationUrl": "null", +"Attachments": "null", +"ParameterClassifications": +[] +}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns00019781845762014694http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns00019781845762014694http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}] +}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns00019781845762014694http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}] +}] +]]></drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>max_time</drools:name> + <drools:value>1m</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>documentation</drools:name> + <drools:value>ManufacturingTask</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>taskname</drools:name> + <drools:value>externalManufacturingTask</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>datainputset</drools:name> + <drools:value>to:String,subject:String,body:String</drools:value> + </drools:metaentry> + </drools:metadata> + </bpmn2:extensionElements> + <bpmn2:documentation id="_40phoC73EeS1AYtvYpBbmA"><![CDATA[ManufacturingTask]]></bpmn2:documentation> + <bpmn2:incoming>_D0127BEA-43BE-4405-9CA6-1BB7B13A77D4</bpmn2:incoming> + <bpmn2:outgoing>_054228DC-266F-4DA8-A63F-8C2695DCC2A2</bpmn2:outgoing> + <bpmn2:ioSpecification id="_40phoS73EeS1AYtvYpBbmA"> + <bpmn2:dataInput id="_7A0D6B74-FB75-4981-B072-0A5131A2CE6E_TaskNameInput" name="TaskName"/> + <bpmn2:dataInput id="_7A0D6B74-FB75-4981-B072-0A5131A2CE6E_toInput" drools:dtype="String" itemSubjectRef="__7A0D6B74-FB75-4981-B072-0A5131A2CE6E_toInputItem" name="to"/> + <bpmn2:dataInput id="_7A0D6B74-FB75-4981-B072-0A5131A2CE6E_subjectInput" drools:dtype="String" itemSubjectRef="__7A0D6B74-FB75-4981-B072-0A5131A2CE6E_subjectInputItem" name="subject"/> + <bpmn2:dataInput id="_7A0D6B74-FB75-4981-B072-0A5131A2CE6E_bodyInput" drools:dtype="String" itemSubjectRef="__7A0D6B74-FB75-4981-B072-0A5131A2CE6E_bodyInputItem" name="body"/> + <bpmn2:inputSet id="_40phoi73EeS1AYtvYpBbmA"> + <bpmn2:dataInputRefs>_7A0D6B74-FB75-4981-B072-0A5131A2CE6E_toInput</bpmn2:dataInputRefs> + <bpmn2:dataInputRefs>_7A0D6B74-FB75-4981-B072-0A5131A2CE6E_subjectInput</bpmn2:dataInputRefs> + <bpmn2:dataInputRefs>_7A0D6B74-FB75-4981-B072-0A5131A2CE6E_bodyInput</bpmn2:dataInputRefs> + <bpmn2:dataInputRefs>_7A0D6B74-FB75-4981-B072-0A5131A2CE6E_TaskNameInput</bpmn2:dataInputRefs> + </bpmn2:inputSet> + <bpmn2:outputSet id="_40phoy73EeS1AYtvYpBbmA"/> + </bpmn2:ioSpecification> + <bpmn2:dataInputAssociation id="_40phpC73EeS1AYtvYpBbmA"> + <bpmn2:targetRef>_7A0D6B74-FB75-4981-B072-0A5131A2CE6E_TaskNameInput</bpmn2:targetRef> + <bpmn2:assignment id="_40phpS73EeS1AYtvYpBbmA"> + <bpmn2:from xsi:type="bpmn2:tFormalExpression" id="_40phpi73EeS1AYtvYpBbmA">externalManufacturingTask</bpmn2:from> + <bpmn2:to xsi:type="bpmn2:tFormalExpression" id="_40qIsC73EeS1AYtvYpBbmA">_7A0D6B74-FB75-4981-B072-0A5131A2CE6E_TaskNameInput</bpmn2:to> + </bpmn2:assignment> + </bpmn2:dataInputAssociation> + <bpmn2:dataInputAssociation id="_40qIsS73EeS1AYtvYpBbmA"> + <bpmn2:targetRef>_7A0D6B74-FB75-4981-B072-0A5131A2CE6E_toInput</bpmn2:targetRef> + <bpmn2:assignment id="_40qIsi73EeS1AYtvYpBbmA"> + <bpmn2:from xsi:type="bpmn2:tFormalExpression" id="_40qIsy73EeS1AYtvYpBbmA"><![CDATA[juergen.mangler@univie.ac.at]]></bpmn2:from> + <bpmn2:to xsi:type="bpmn2:tFormalExpression" id="_40qItC73EeS1AYtvYpBbmA">_7A0D6B74-FB75-4981-B072-0A5131A2CE6E_toInput</bpmn2:to> + </bpmn2:assignment> + </bpmn2:dataInputAssociation> + <bpmn2:dataInputAssociation id="_40qItS73EeS1AYtvYpBbmA"> + <bpmn2:targetRef>_7A0D6B74-FB75-4981-B072-0A5131A2CE6E_subjectInput</bpmn2:targetRef> + <bpmn2:assignment id="_40qIti73EeS1AYtvYpBbmA"> + <bpmn2:from xsi:type="bpmn2:tFormalExpression" id="_40qIty73EeS1AYtvYpBbmA"><![CDATA[Defect Part]]></bpmn2:from> + <bpmn2:to xsi:type="bpmn2:tFormalExpression" id="_40qIuC73EeS1AYtvYpBbmA">_7A0D6B74-FB75-4981-B072-0A5131A2CE6E_subjectInput</bpmn2:to> + </bpmn2:assignment> + </bpmn2:dataInputAssociation> + <bpmn2:dataInputAssociation id="_40qIuS73EeS1AYtvYpBbmA"> + <bpmn2:targetRef>_7A0D6B74-FB75-4981-B072-0A5131A2CE6E_bodyInput</bpmn2:targetRef> + <bpmn2:assignment id="_40qIui73EeS1AYtvYpBbmA"> + <bpmn2:from xsi:type="bpmn2:tFormalExpression" id="_40qIuy73EeS1AYtvYpBbmA"><![CDATA[data.defectid]]></bpmn2:from> + <bpmn2:to xsi:type="bpmn2:tFormalExpression" id="_40qIvC73EeS1AYtvYpBbmA">_7A0D6B74-FB75-4981-B072-0A5131A2CE6E_bodyInput</bpmn2:to> + </bpmn2:assignment> + </bpmn2:dataInputAssociation> + </bpmn2:task> + <bpmn2:task id="_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE" drools:selectable="true" drools:taskName="smartobject" name="Receive"> + <bpmn2:extensionElements> + <drools:metadata> + <drools:metaentry> + <drools:name>tasktype</drools:name> + <drools:value>smartobject</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>script_language</drools:name> + <drools:value>javascript</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>fontcolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>bgcolor</drools:name> + <drools:value>#fafad2</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>bordercolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>resourceId</drools:name> + <drools:value>_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>name</drools:name> + <drools:value>Receive</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>avg_time</drools:name> + <drools:value>1m</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>isselectable</drools:name> + <drools:value>true</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>asdomain</drools:name> + <drools:value>29.3 - Manufacture of parts and accessories for motor vehicles</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>dataoutputset</drools:name> + <drools:value>SensorTimestamp:String,SensorData:String,LocationValid:String,LocationTimestamp:String,LocationLatitude:Float,LocationLongitude:Float,LocationAccuracy:String,SensorID:Integer,OwnerID:String</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>origbordercolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>script</drools:name> + <drools:value><![CDATA[data.defectid = result.SensorData;]]></drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>origbgcolor</drools:name> + <drools:value>#fafad2</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>min_time</drools:name> + <drools:value>1m</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>assignments</drools:name> + <drools:value>SensorID=14</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>typeproc</drools:name> + <drools:value>29.3223 - Manufacture of Research and Development for motor vehicles </drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>company</drools:name> + <drools:value><![CDATA[[{ +"serviceId": "111", +"serviceLabel": "Manual Labor", +"serviceEndpoint": "xmpp-r://adventure_gateway_uvi@fp7-adventure.eu", +"orgName": "Mangler Sensor CO", +"profileId": "22", +"serviceOperation": "26", +"serviceOperationLabel": "push", +"dataInputs": +[{ +"name": "SensorID", +"standardType": "Integer"}, +{ +"name": "OwnerID", +"standardType": "Integer"}] +, +"dataOutputs": +[{ +"name": "SensorTimestamp", +"standardType": "String"}, +{ +"name": "SensorData", +"standardType": "String"}, +{ +"name": "LocationValid", +"standardType": "String"}, +{ +"name": "LocationTimestamp", +"standardType": "String"}, +{ +"name": "LocationLatitude", +"standardType": "Float"}, +{ +"name": "LocationLongitude", +"standardType": "Float"}, +{ +"name": "LocationAccuracy", +"standardType": "String"}, +{ +"name": "SensorID", +"standardType": "Integer"}, +{ +"name": "OwnerID", +"standardType": "String"}] +, +"order": "1", +"serviceOperations": +[{ +"initData": { +"OperationId": "26", +"InterfaceId": "61", +"Name": "push", +"Description": "null", +"Method": "PUSH", +"Attachments": "null", +"OperationParameters": +[{ +"initData": { +"Id": "30", +"OperationId": "26", +"ParameterId": "38", +"Type": "INPUT", +"Parameter": { +"initData": { +"ParameterId": "38", +"Name": "SensorID", +"Description": "null", +"DataType": "INT", +"SpecificationUrl": "null", +"Attachments": "null", +"ParameterClassifications": +[] +}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns06429044451067909http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns06429044451067909http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}, +{ +"initData": { +"Id": "31", +"OperationId": "26", +"ParameterId": "39", +"Type": "OUTPUT", +"Parameter": { +"initData": { +"ParameterId": "39", +"Name": "SensorTimestamp", +"Description": "null", +"DataType": "STRING", +"SpecificationUrl": "null", +"Attachments": "null", +"ParameterClassifications": +[] +}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns06429044451067909http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns06429044451067909http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}, +{ +"initData": { +"Id": "32", +"OperationId": "26", +"ParameterId": "40", +"Type": "OUTPUT", +"Parameter": { +"initData": { +"ParameterId": "40", +"Name": "SensorData", +"Description": "null", +"DataType": "STRING", +"SpecificationUrl": "null", +"Attachments": "null", +"ParameterClassifications": +[] +}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns06429044451067909http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns06429044451067909http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}, +{ +"initData": { +"Id": "33", +"OperationId": "26", +"ParameterId": "41", +"Type": "OUTPUT", +"Parameter": { +"initData": { +"ParameterId": "41", +"Name": "LocationValid", +"Description": "null", +"DataType": "STRING", +"SpecificationUrl": "null", +"Attachments": "null", +"ParameterClassifications": +[] +}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns06429044451067909http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns06429044451067909http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}, +{ +"initData": { +"Id": "34", +"OperationId": "26", +"ParameterId": "42", +"Type": "OUTPUT", +"Parameter": { +"initData": { +"ParameterId": "42", +"Name": "LocationTimestamp", +"Description": "null", +"DataType": "STRING", +"SpecificationUrl": "null", +"Attachments": "null", +"ParameterClassifications": +[] +}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns06429044451067909http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns06429044451067909http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}, +{ +"initData": { +"Id": "35", +"OperationId": "26", +"ParameterId": "43", +"Type": "OUTPUT", +"Parameter": { +"initData": { +"ParameterId": "43", +"Name": "LocationLatitude", +"Description": "null", +"DataType": "FLOAT", +"SpecificationUrl": "null", +"Attachments": "null", +"ParameterClassifications": +[] +}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns06429044451067909http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns06429044451067909http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}, +{ +"initData": { +"Id": "36", +"OperationId": "26", +"ParameterId": "44", +"Type": "OUTPUT", +"Parameter": { +"initData": { +"ParameterId": "44", +"Name": "LocationLongitude", +"Description": "null", +"DataType": "FLOAT", +"SpecificationUrl": "null", +"Attachments": "null", +"ParameterClassifications": +[] +}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns06429044451067909http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns06429044451067909http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}, +{ +"initData": { +"Id": "37", +"OperationId": "26", +"ParameterId": "45", +"Type": "OUTPUT", +"Parameter": { +"initData": { +"ParameterId": "45", +"Name": "LocationAccuracy", +"Description": "null", +"DataType": "STRING", +"SpecificationUrl": "null", +"Attachments": "null", +"ParameterClassifications": +[] +}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns06429044451067909http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns06429044451067909http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}, +{ +"initData": { +"Id": "38", +"OperationId": "26", +"ParameterId": "46", +"Type": "OUTPUT", +"Parameter": { +"initData": { +"ParameterId": "46", +"Name": "SensorID", +"Description": "null", +"DataType": "INT", +"SpecificationUrl": "null", +"Attachments": "null", +"ParameterClassifications": +[] +}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns06429044451067909http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns06429044451067909http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}, +{ +"initData": { +"Id": "39", +"OperationId": "26", +"ParameterId": "47", +"Type": "OUTPUT", +"Parameter": { +"initData": { +"ParameterId": "47", +"Name": "OwnerID", +"Description": "null", +"DataType": "STRING", +"SpecificationUrl": "null", +"Attachments": "null", +"ParameterClassifications": +[] +}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns06429044451067909http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns06429044451067909http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}, +{ +"initData": { +"Id": "40", +"OperationId": "26", +"ParameterId": "48", +"Type": "INPUT", +"Parameter": { +"initData": { +"ParameterId": "48", +"Name": "OwnerID", +"Description": "null", +"DataType": "INT", +"SpecificationUrl": "null", +"Attachments": "null", +"ParameterClassifications": +[] +}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns06429044451067909http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns06429044451067909http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}] +}, +"context": "null", +"isValidated": "false", +"_storeToken": { +"typeName": "ns06429044451067909http___isoft_technology_de_odata_DPD_svc.com.isoft.dpd.model.DPDEntities", +"args": { +"name": "oData", +"oDataServiceHost": "http://isoft-technology.de/odata/DPD.svc", +"maxDataServiceVersion": "2.0"}}}] +}] +]]></drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>max_time</drools:name> + <drools:value>1m</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>documentation</drools:name> + <drools:value>Smart Object</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>taskname</drools:name> + <drools:value>smartobject</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>datainputset</drools:name> + <drools:value>SensorID:Integer,OwnerID:Integer</drools:value> + </drools:metaentry> + </drools:metadata> + </bpmn2:extensionElements> + <bpmn2:documentation id="_40qIvS73EeS1AYtvYpBbmA"><![CDATA[Smart Object]]></bpmn2:documentation> + <bpmn2:incoming>_A3BF1D3B-BA14-4641-A17E-124082F0B197</bpmn2:incoming> + <bpmn2:incoming>_E6F2E675-F1AB-4CE8-988F-845B9C345013</bpmn2:incoming> + <bpmn2:outgoing>_D0127BEA-43BE-4405-9CA6-1BB7B13A77D4</bpmn2:outgoing> + <bpmn2:ioSpecification id="_40qIvi73EeS1AYtvYpBbmA"> + <bpmn2:dataInput id="_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_TaskNameInput" name="TaskName"/> + <bpmn2:dataInput id="_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_SensorIDInput" drools:dtype="Integer" itemSubjectRef="__AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_SensorIDInputItem" name="SensorID"/> + <bpmn2:dataInput id="_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_OwnerIDInput" drools:dtype="Integer" itemSubjectRef="__AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_OwnerIDInputItem" name="OwnerID"/> + <bpmn2:dataOutput id="_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_SensorTimestampOutput" drools:dtype="String" itemSubjectRef="__AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_SensorTimestampOutputItem" name="SensorTimestamp"/> + <bpmn2:dataOutput id="_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_SensorDataOutput" drools:dtype="String" itemSubjectRef="__AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_SensorDataOutputItem" name="SensorData"/> + <bpmn2:dataOutput id="_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_LocationValidOutput" drools:dtype="String" itemSubjectRef="__AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_LocationValidOutputItem" name="LocationValid"/> + <bpmn2:dataOutput id="_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_LocationTimestampOutput" drools:dtype="String" itemSubjectRef="__AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_LocationTimestampOutputItem" name="LocationTimestamp"/> + <bpmn2:dataOutput id="_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_LocationLatitudeOutput" drools:dtype="Float" itemSubjectRef="__AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_LocationLatitudeOutputItem" name="LocationLatitude"/> + <bpmn2:dataOutput id="_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_LocationLongitudeOutput" drools:dtype="Float" itemSubjectRef="__AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_LocationLongitudeOutputItem" name="LocationLongitude"/> + <bpmn2:dataOutput id="_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_LocationAccuracyOutput" drools:dtype="String" itemSubjectRef="__AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_LocationAccuracyOutputItem" name="LocationAccuracy"/> + <bpmn2:dataOutput id="_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_SensorIDOutput" drools:dtype="Integer" itemSubjectRef="__AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_SensorIDOutputItem" name="SensorID"/> + <bpmn2:dataOutput id="_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_OwnerIDOutput" drools:dtype="String" itemSubjectRef="__AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_OwnerIDOutputItem" name="OwnerID"/> + <bpmn2:inputSet id="_40qIvy73EeS1AYtvYpBbmA"> + <bpmn2:dataInputRefs>_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_SensorIDInput</bpmn2:dataInputRefs> + <bpmn2:dataInputRefs>_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_OwnerIDInput</bpmn2:dataInputRefs> + <bpmn2:dataInputRefs>_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_TaskNameInput</bpmn2:dataInputRefs> + </bpmn2:inputSet> + <bpmn2:outputSet id="_40qvwC73EeS1AYtvYpBbmA"> + <bpmn2:dataOutputRefs>_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_SensorTimestampOutput</bpmn2:dataOutputRefs> + <bpmn2:dataOutputRefs>_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_SensorDataOutput</bpmn2:dataOutputRefs> + <bpmn2:dataOutputRefs>_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_LocationValidOutput</bpmn2:dataOutputRefs> + <bpmn2:dataOutputRefs>_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_LocationTimestampOutput</bpmn2:dataOutputRefs> + <bpmn2:dataOutputRefs>_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_LocationLatitudeOutput</bpmn2:dataOutputRefs> + <bpmn2:dataOutputRefs>_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_LocationLongitudeOutput</bpmn2:dataOutputRefs> + <bpmn2:dataOutputRefs>_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_LocationAccuracyOutput</bpmn2:dataOutputRefs> + <bpmn2:dataOutputRefs>_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_SensorIDOutput</bpmn2:dataOutputRefs> + <bpmn2:dataOutputRefs>_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_OwnerIDOutput</bpmn2:dataOutputRefs> + </bpmn2:outputSet> + </bpmn2:ioSpecification> + <bpmn2:dataInputAssociation id="_40qvwS73EeS1AYtvYpBbmA"> + <bpmn2:targetRef>_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_TaskNameInput</bpmn2:targetRef> + <bpmn2:assignment id="_40qvwi73EeS1AYtvYpBbmA"> + <bpmn2:from xsi:type="bpmn2:tFormalExpression" id="_40qvwy73EeS1AYtvYpBbmA">smartobject</bpmn2:from> + <bpmn2:to xsi:type="bpmn2:tFormalExpression" id="_40qvxC73EeS1AYtvYpBbmA">_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_TaskNameInput</bpmn2:to> + </bpmn2:assignment> + </bpmn2:dataInputAssociation> + <bpmn2:dataInputAssociation id="_40qvxS73EeS1AYtvYpBbmA"> + <bpmn2:targetRef>_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_SensorIDInput</bpmn2:targetRef> + <bpmn2:assignment id="_40qvxi73EeS1AYtvYpBbmA"> + <bpmn2:from xsi:type="bpmn2:tFormalExpression" id="_40qvxy73EeS1AYtvYpBbmA"><![CDATA[14]]></bpmn2:from> + <bpmn2:to xsi:type="bpmn2:tFormalExpression" id="_40qvyC73EeS1AYtvYpBbmA">_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE_SensorIDInput</bpmn2:to> + </bpmn2:assignment> + </bpmn2:dataInputAssociation> + </bpmn2:task> + <bpmn2:sequenceFlow id="_054228DC-266F-4DA8-A63F-8C2695DCC2A2" drools:bgcolor="#000000" drools:selectable="true" drools:probability1="100" drools:probability2="100" drools:repetition1="100" drools:repetition2="100" sourceRef="_7A0D6B74-FB75-4981-B072-0A5131A2CE6E" targetRef="_8289E931-8723-4DEB-A62C-6CAF91139B0B"/> + <bpmn2:callActivity id="_8289E931-8723-4DEB-A62C-6CAF91139B0B" drools:selectable="true" drools:independent="true" drools:waitForCompletion="true" name="Spawn self" calledElement="53cd4af1e4b0207100d2266e"> + <bpmn2:extensionElements> + <drools:metadata> + <drools:metaentry> + <drools:name>waitforcompletion</drools:name> + <drools:value>true</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>script_language</drools:name> + <drools:value>javascript</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>fontcolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>bgcolor</drools:name> + <drools:value>#fafad2</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>bordercolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>resourceId</drools:name> + <drools:value>_8289E931-8723-4DEB-A62C-6CAF91139B0B</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>name</drools:name> + <drools:value>Spawn self</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>activitytype</drools:name> + <drools:value>Sub-Process</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>isselectable</drools:name> + <drools:value>true</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>origbordercolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>origbgcolor</drools:name> + <drools:value>#fafad2</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>independent</drools:name> + <drools:value>true</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>calledelement</drools:name> + <drools:value>53cd4af1e4b0207100d2266e</drools:value> + </drools:metaentry> + </drools:metadata> + </bpmn2:extensionElements> + <bpmn2:incoming>_054228DC-266F-4DA8-A63F-8C2695DCC2A2</bpmn2:incoming> + <bpmn2:outgoing>_4054B828-4EB8-4340-B318-90CC78EB1209</bpmn2:outgoing> + </bpmn2:callActivity> + <bpmn2:sequenceFlow id="_E6F2E675-F1AB-4CE8-988F-845B9C345013" drools:bgcolor="#000000" drools:selectable="true" drools:probability1="99" drools:probability2="50" drools:repetition1="5" drools:repetition2="2" sourceRef="_D56D4095-0CB0-4E87-9A06-BF55B25904D1" targetRef="_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE"> + <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression" id="_40rW0C73EeS1AYtvYpBbmA" language="http://www.mvel.org/2.0"><![CDATA[data.b == 3]]></bpmn2:conditionExpression> + </bpmn2:sequenceFlow> + <bpmn2:exclusiveGateway id="_DC97D697-E940-4E48-8185-6BA92FA94418" drools:bgcolor="#f0e68c" drools:selectable="true" drools:bordercolor="#a67f00" drools:dg="" name="" gatewayDirection="Diverging"> + <bpmn2:incoming>_05393109-B58E-44C3-8BF2-00C4B2421310</bpmn2:incoming> + <bpmn2:outgoing>_C3E3C56A-141C-4641-BB0E-C8D06D37F097</bpmn2:outgoing> + <bpmn2:outgoing>_4F965CA3-9A84-498F-A426-E5366BD31C5C</bpmn2:outgoing> + </bpmn2:exclusiveGateway> + <bpmn2:sequenceFlow id="_05393109-B58E-44C3-8BF2-00C4B2421310" drools:bgcolor="#000000" drools:selectable="true" drools:probability1="100" drools:probability2="100" drools:repetition1="100" drools:repetition2="100" sourceRef="_E70CB5E9-B76F-42ED-9950-F140E90F1103" targetRef="_DC97D697-E940-4E48-8185-6BA92FA94418"/> + <bpmn2:task id="_5B1B9F91-15AE-48CA-BD3D-CE6A41DC9729" drools:selectable="true" name="b"> + <bpmn2:extensionElements> + <drools:metadata> + <drools:metaentry> + <drools:name>tasktype</drools:name> + <drools:value>None</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>looptype</drools:name> + <drools:value>None</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>script_language</drools:name> + <drools:value>javascript</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>behavior</drools:name> + <drools:value>all</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>fontcolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>bgcolor</drools:name> + <drools:value>#fafad2</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>bordercolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>resourceId</drools:name> + <drools:value>_5B1B9F91-15AE-48CA-BD3D-CE6A41DC9729</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>name</drools:name> + <drools:value>b</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>isselectable</drools:name> + <drools:value>true</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>origbordercolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>origbgcolor</drools:name> + <drools:value>#fafad2</drools:value> + </drools:metaentry> + </drools:metadata> + </bpmn2:extensionElements> + <bpmn2:incoming>_C3E3C56A-141C-4641-BB0E-C8D06D37F097</bpmn2:incoming> + <bpmn2:outgoing>_61243086-D25B-4C49-9E1B-D969A7BD6C2D</bpmn2:outgoing> + </bpmn2:task> + <bpmn2:sequenceFlow id="_C3E3C56A-141C-4641-BB0E-C8D06D37F097" drools:bgcolor="#000000" drools:selectable="true" drools:probability1="20" drools:probability2="0" drools:repetition1="0" drools:repetition2="0" sourceRef="_DC97D697-E940-4E48-8185-6BA92FA94418" targetRef="_5B1B9F91-15AE-48CA-BD3D-CE6A41DC9729"/> + <bpmn2:task id="_AE358313-9923-47D4-8D7F-2BD2DBD3C726" drools:selectable="true" name="a"> + <bpmn2:extensionElements> + <drools:metadata> + <drools:metaentry> + <drools:name>tasktype</drools:name> + <drools:value>None</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>looptype</drools:name> + <drools:value>None</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>script_language</drools:name> + <drools:value>javascript</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>behavior</drools:name> + <drools:value>all</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>fontcolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>bgcolor</drools:name> + <drools:value>#fafad2</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>bordercolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>resourceId</drools:name> + <drools:value>_AE358313-9923-47D4-8D7F-2BD2DBD3C726</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>name</drools:name> + <drools:value>a</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>isselectable</drools:name> + <drools:value>true</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>origbordercolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>origbgcolor</drools:name> + <drools:value>#fafad2</drools:value> + </drools:metaentry> + </drools:metadata> + </bpmn2:extensionElements> + <bpmn2:incoming>_4F965CA3-9A84-498F-A426-E5366BD31C5C</bpmn2:incoming> + <bpmn2:outgoing>_2C144E08-F30C-4F06-B84D-A9A848B7F99D</bpmn2:outgoing> + </bpmn2:task> + <bpmn2:sequenceFlow id="_4F965CA3-9A84-498F-A426-E5366BD31C5C" drools:bgcolor="#000000" drools:selectable="true" drools:probability1="80" drools:probability2="100" drools:repetition1="100" drools:repetition2="100" sourceRef="_DC97D697-E940-4E48-8185-6BA92FA94418" targetRef="_AE358313-9923-47D4-8D7F-2BD2DBD3C726"> + <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression" id="_40rW0S73EeS1AYtvYpBbmA" language="http://www.mvel.org/2.0"><![CDATA[true]]></bpmn2:conditionExpression> + </bpmn2:sequenceFlow> + <bpmn2:exclusiveGateway id="_3627B530-52F6-4EFC-B9D1-FC3D28F7BC13" drools:bgcolor="#f0e68c" drools:selectable="true" drools:bordercolor="#a67f00" drools:dg="" name="" gatewayDirection="Converging"> + <bpmn2:incoming>_2C144E08-F30C-4F06-B84D-A9A848B7F99D</bpmn2:incoming> + <bpmn2:incoming>_61243086-D25B-4C49-9E1B-D969A7BD6C2D</bpmn2:incoming> + <bpmn2:outgoing>_A3BF1D3B-BA14-4641-A17E-124082F0B197</bpmn2:outgoing> + </bpmn2:exclusiveGateway> + <bpmn2:sequenceFlow id="_2C144E08-F30C-4F06-B84D-A9A848B7F99D" drools:bgcolor="#000000" drools:selectable="true" drools:probability1="100" drools:probability2="100" drools:repetition1="100" drools:repetition2="100" sourceRef="_AE358313-9923-47D4-8D7F-2BD2DBD3C726" targetRef="_3627B530-52F6-4EFC-B9D1-FC3D28F7BC13"/> + <bpmn2:sequenceFlow id="_61243086-D25B-4C49-9E1B-D969A7BD6C2D" drools:bgcolor="#000000" drools:selectable="true" drools:probability1="100" drools:probability2="100" drools:repetition1="100" drools:repetition2="100" sourceRef="_5B1B9F91-15AE-48CA-BD3D-CE6A41DC9729" targetRef="_3627B530-52F6-4EFC-B9D1-FC3D28F7BC13"/> + <bpmn2:endEvent id="_34403A64-3974-4F36-83FE-9CE29EF57C00" drools:bgcolor="#ff6347" drools:selectable="true" name=""> + <bpmn2:incoming>_57C35252-FD8D-45A7-A81A-B69E548FD723</bpmn2:incoming> + </bpmn2:endEvent> + <bpmn2:sequenceFlow id="_57C35252-FD8D-45A7-A81A-B69E548FD723" drools:bgcolor="#000000" drools:selectable="true" drools:probability1="100" drools:probability2="100" drools:repetition1="100" drools:repetition2="100" sourceRef="_090E39D5-85C9-44D7-9BBC-0C3A91004BC0" targetRef="_34403A64-3974-4F36-83FE-9CE29EF57C00"/> + <bpmn2:exclusiveGateway id="_D56D4095-0CB0-4E87-9A06-BF55B25904D1" drools:bgcolor="#f0e68c" drools:selectable="true" drools:bordercolor="#a67f00" drools:dg="" name="" gatewayDirection="Diverging"> + <bpmn2:incoming>_4054B828-4EB8-4340-B318-90CC78EB1209</bpmn2:incoming> + <bpmn2:outgoing>_E6F2E675-F1AB-4CE8-988F-845B9C345013</bpmn2:outgoing> + <bpmn2:outgoing>_8B2D0306-7C68-466C-A192-D9637B1A2AC5</bpmn2:outgoing> + </bpmn2:exclusiveGateway> + <bpmn2:sequenceFlow id="_4054B828-4EB8-4340-B318-90CC78EB1209" drools:bgcolor="#000000" drools:selectable="true" drools:probability1="100" drools:probability2="100" drools:repetition1="100" drools:repetition2="100" sourceRef="_8289E931-8723-4DEB-A62C-6CAF91139B0B" targetRef="_D56D4095-0CB0-4E87-9A06-BF55B25904D1"/> + <bpmn2:parallelGateway id="_3D7F7AE5-4420-4669-B415-E4BFF113E047" drools:bgcolor="#f0e68c" drools:selectable="true" drools:bordercolor="#a67f00" name="" gatewayDirection="Diverging"> + <bpmn2:incoming>_8B2D0306-7C68-466C-A192-D9637B1A2AC5</bpmn2:incoming> + <bpmn2:outgoing>_1827492A-0604-4974-A692-AF7D5CC78C14</bpmn2:outgoing> + <bpmn2:outgoing>_F50480EA-AC72-465F-B07C-7324B16B7F56</bpmn2:outgoing> + <bpmn2:outgoing>_1221DA43-76AB-4A51-9AE3-E423C47A9FF8</bpmn2:outgoing> + </bpmn2:parallelGateway> + <bpmn2:sequenceFlow id="_8B2D0306-7C68-466C-A192-D9637B1A2AC5" drools:bgcolor="#000000" drools:selectable="true" drools:probability1="100" drools:probability2="100" drools:repetition1="100" drools:repetition2="100" sourceRef="_D56D4095-0CB0-4E87-9A06-BF55B25904D1" targetRef="_3D7F7AE5-4420-4669-B415-E4BFF113E047"/> + <bpmn2:task id="_53550CE0-4E1F-4171-AA2C-25D8599C2479" drools:selectable="true" name="c"> + <bpmn2:extensionElements> + <drools:metadata> + <drools:metaentry> + <drools:name>tasktype</drools:name> + <drools:value>None</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>looptype</drools:name> + <drools:value>None</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>script_language</drools:name> + <drools:value>javascript</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>behavior</drools:name> + <drools:value>all</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>fontcolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>bgcolor</drools:name> + <drools:value>#fafad2</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>bordercolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>resourceId</drools:name> + <drools:value>_53550CE0-4E1F-4171-AA2C-25D8599C2479</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>name</drools:name> + <drools:value>c</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>isselectable</drools:name> + <drools:value>true</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>origbordercolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>origbgcolor</drools:name> + <drools:value>#fafad2</drools:value> + </drools:metaentry> + </drools:metadata> + </bpmn2:extensionElements> + <bpmn2:incoming>_1827492A-0604-4974-A692-AF7D5CC78C14</bpmn2:incoming> + <bpmn2:outgoing>_DB134771-8CD6-47FE-8843-75E730F194DC</bpmn2:outgoing> + </bpmn2:task> + <bpmn2:sequenceFlow id="_1827492A-0604-4974-A692-AF7D5CC78C14" drools:bgcolor="#000000" drools:selectable="true" drools:probability1="100" drools:probability2="100" drools:repetition1="100" drools:repetition2="100" sourceRef="_3D7F7AE5-4420-4669-B415-E4BFF113E047" targetRef="_53550CE0-4E1F-4171-AA2C-25D8599C2479"/> + <bpmn2:task id="_0DE2B5EE-4CC8-4FD6-972B-FC76C25FB43F" drools:selectable="true" name="d"> + <bpmn2:extensionElements> + <drools:metadata> + <drools:metaentry> + <drools:name>tasktype</drools:name> + <drools:value>None</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>looptype</drools:name> + <drools:value>None</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>script_language</drools:name> + <drools:value>javascript</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>behavior</drools:name> + <drools:value>all</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>fontcolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>bgcolor</drools:name> + <drools:value>#fafad2</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>bordercolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>resourceId</drools:name> + <drools:value>_0DE2B5EE-4CC8-4FD6-972B-FC76C25FB43F</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>name</drools:name> + <drools:value>d</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>isselectable</drools:name> + <drools:value>true</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>origbordercolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>origbgcolor</drools:name> + <drools:value>#fafad2</drools:value> + </drools:metaentry> + </drools:metadata> + </bpmn2:extensionElements> + <bpmn2:incoming>_F50480EA-AC72-465F-B07C-7324B16B7F56</bpmn2:incoming> + <bpmn2:outgoing>_256806B5-18BF-45C6-BDFC-23B560A9DC1A</bpmn2:outgoing> + </bpmn2:task> + <bpmn2:sequenceFlow id="_F50480EA-AC72-465F-B07C-7324B16B7F56" drools:bgcolor="#000000" drools:selectable="true" drools:probability1="100" drools:probability2="100" drools:repetition1="100" drools:repetition2="100" sourceRef="_3D7F7AE5-4420-4669-B415-E4BFF113E047" targetRef="_0DE2B5EE-4CC8-4FD6-972B-FC76C25FB43F"/> + <bpmn2:task id="_E6E9EEFD-BDDF-4946-9FBF-85ABF92F72CC" drools:selectable="true" name="e"> + <bpmn2:extensionElements> + <drools:metadata> + <drools:metaentry> + <drools:name>tasktype</drools:name> + <drools:value>None</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>looptype</drools:name> + <drools:value>None</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>script_language</drools:name> + <drools:value>javascript</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>behavior</drools:name> + <drools:value>all</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>fontcolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>bgcolor</drools:name> + <drools:value>#fafad2</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>bordercolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>resourceId</drools:name> + <drools:value>_E6E9EEFD-BDDF-4946-9FBF-85ABF92F72CC</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>name</drools:name> + <drools:value>e</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>isselectable</drools:name> + <drools:value>true</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>origbordercolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>origbgcolor</drools:name> + <drools:value>#fafad2</drools:value> + </drools:metaentry> + </drools:metadata> + </bpmn2:extensionElements> + <bpmn2:incoming>_1221DA43-76AB-4A51-9AE3-E423C47A9FF8</bpmn2:incoming> + <bpmn2:outgoing>_19997DA4-320C-4F45-8859-0CB5CFBA33FE</bpmn2:outgoing> + </bpmn2:task> + <bpmn2:sequenceFlow id="_1221DA43-76AB-4A51-9AE3-E423C47A9FF8" drools:bgcolor="#000000" drools:selectable="true" drools:probability1="100" drools:probability2="100" drools:repetition1="100" drools:repetition2="100" sourceRef="_3D7F7AE5-4420-4669-B415-E4BFF113E047" targetRef="_E6E9EEFD-BDDF-4946-9FBF-85ABF92F72CC"/> + <bpmn2:parallelGateway id="_F4ECF068-6E60-45A4-B6C9-E13C1F0ABF85" drools:bgcolor="#f0e68c" drools:selectable="true" drools:bordercolor="#a67f00" name="" gatewayDirection="Converging"> + <bpmn2:incoming>_DB134771-8CD6-47FE-8843-75E730F194DC</bpmn2:incoming> + <bpmn2:incoming>_256806B5-18BF-45C6-BDFC-23B560A9DC1A</bpmn2:incoming> + <bpmn2:incoming>_19997DA4-320C-4F45-8859-0CB5CFBA33FE</bpmn2:incoming> + <bpmn2:outgoing>_0B51E7E0-24E9-487F-94FA-5F178D5DC41D</bpmn2:outgoing> + </bpmn2:parallelGateway> + <bpmn2:sequenceFlow id="_DB134771-8CD6-47FE-8843-75E730F194DC" drools:bgcolor="#000000" drools:selectable="true" drools:probability1="100" drools:probability2="100" drools:repetition1="100" drools:repetition2="100" sourceRef="_53550CE0-4E1F-4171-AA2C-25D8599C2479" targetRef="_F4ECF068-6E60-45A4-B6C9-E13C1F0ABF85"/> + <bpmn2:sequenceFlow id="_256806B5-18BF-45C6-BDFC-23B560A9DC1A" drools:bgcolor="#000000" drools:selectable="true" drools:probability1="100" drools:probability2="100" drools:repetition1="100" drools:repetition2="100" sourceRef="_0DE2B5EE-4CC8-4FD6-972B-FC76C25FB43F" targetRef="_F4ECF068-6E60-45A4-B6C9-E13C1F0ABF85"/> + <bpmn2:sequenceFlow id="_19997DA4-320C-4F45-8859-0CB5CFBA33FE" drools:bgcolor="#000000" drools:selectable="true" drools:probability1="100" drools:probability2="100" drools:repetition1="100" drools:repetition2="100" sourceRef="_E6E9EEFD-BDDF-4946-9FBF-85ABF92F72CC" targetRef="_F4ECF068-6E60-45A4-B6C9-E13C1F0ABF85"/> + <bpmn2:exclusiveGateway id="_090E39D5-85C9-44D7-9BBC-0C3A91004BC0" drools:bgcolor="#f0e68c" drools:selectable="true" drools:bordercolor="#a67f00" drools:dg="" name=""> + <bpmn2:incoming>_9EF997A4-881E-401E-8D23-D4CC9317DFA9</bpmn2:incoming> + <bpmn2:incoming>_0B51E7E0-24E9-487F-94FA-5F178D5DC41D</bpmn2:incoming> + <bpmn2:outgoing>_57C35252-FD8D-45A7-A81A-B69E548FD723</bpmn2:outgoing> + <bpmn2:outgoing>_4D029375-58C1-40B9-ABFB-6984240DAF2A</bpmn2:outgoing> + </bpmn2:exclusiveGateway> + <bpmn2:sequenceFlow id="_0B51E7E0-24E9-487F-94FA-5F178D5DC41D" drools:bgcolor="#000000" drools:selectable="true" drools:probability1="100" drools:probability2="100" drools:repetition1="100" drools:repetition2="100" sourceRef="_F4ECF068-6E60-45A4-B6C9-E13C1F0ABF85" targetRef="_090E39D5-85C9-44D7-9BBC-0C3A91004BC0"/> + <bpmn2:task id="_60EE8970-2AC4-490C-9638-538EDF84F9F8" drools:selectable="true" name="f"> + <bpmn2:extensionElements> + <drools:metadata> + <drools:metaentry> + <drools:name>tasktype</drools:name> + <drools:value>None</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>looptype</drools:name> + <drools:value>None</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>script_language</drools:name> + <drools:value>javascript</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>behavior</drools:name> + <drools:value>all</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>fontcolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>bgcolor</drools:name> + <drools:value>#fafad2</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>bordercolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>resourceId</drools:name> + <drools:value>_60EE8970-2AC4-490C-9638-538EDF84F9F8</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>name</drools:name> + <drools:value>f</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>isselectable</drools:name> + <drools:value>true</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>origbordercolor</drools:name> + <drools:value>#000000</drools:value> + </drools:metaentry> + <drools:metaentry> + <drools:name>origbgcolor</drools:name> + <drools:value>#fafad2</drools:value> + </drools:metaentry> + </drools:metadata> + </bpmn2:extensionElements> + <bpmn2:incoming>_4D029375-58C1-40B9-ABFB-6984240DAF2A</bpmn2:incoming> + <bpmn2:outgoing>_9EF997A4-881E-401E-8D23-D4CC9317DFA9</bpmn2:outgoing> + </bpmn2:task> + <bpmn2:sequenceFlow id="_4D029375-58C1-40B9-ABFB-6984240DAF2A" drools:bgcolor="#000000" drools:selectable="true" drools:probability1="60" drools:probability2="40" drools:repetition1="3" drools:repetition2="5" sourceRef="_090E39D5-85C9-44D7-9BBC-0C3A91004BC0" targetRef="_60EE8970-2AC4-490C-9638-538EDF84F9F8"> + <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression" id="_40sk8C73EeS1AYtvYpBbmA" language="http://www.mvel.org/2.0"><![CDATA[true]]></bpmn2:conditionExpression> + </bpmn2:sequenceFlow> + <bpmn2:sequenceFlow id="_9EF997A4-881E-401E-8D23-D4CC9317DFA9" drools:bgcolor="#000000" drools:selectable="true" drools:probability1="100" drools:probability2="100" drools:repetition1="100" drools:repetition2="100" sourceRef="_60EE8970-2AC4-490C-9638-538EDF84F9F8" targetRef="_090E39D5-85C9-44D7-9BBC-0C3A91004BC0"/> + </bpmn2:process> + <bpmndi:BPMNDiagram id="_40tMAC73EeS1AYtvYpBbmA"> + <bpmndi:BPMNPlane id="_40tMAS73EeS1AYtvYpBbmA" bpmnElement="53cd4af1e4b0207100d2266e"> + <bpmndi:BPMNShape id="_40tMAi73EeS1AYtvYpBbmA" bpmnElement="_E70CB5E9-B76F-42ED-9950-F140E90F1103"> + <dc:Bounds height="30.0" width="30.0" x="135.0" y="660.0"/> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="_40tMAy73EeS1AYtvYpBbmA" bpmnElement="_A3BF1D3B-BA14-4641-A17E-124082F0B197"> + <di:waypoint xsi:type="dc:Point" x="150.0" y="335.0"/> + <di:waypoint xsi:type="dc:Point" x="150.0" y="228.0"/> + <di:waypoint xsi:type="dc:Point" x="239.0" y="228.0"/> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="_40tMBC73EeS1AYtvYpBbmA" bpmnElement="_D0127BEA-43BE-4405-9CA6-1BB7B13A77D4"> + <di:waypoint xsi:type="dc:Point" x="239.0" y="228.0"/> + <di:waypoint xsi:type="dc:Point" x="384.0" y="228.0"/> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="_40tMBS73EeS1AYtvYpBbmA" bpmnElement="_7A0D6B74-FB75-4981-B072-0A5131A2CE6E"> + <dc:Bounds height="80.0" width="100.0" x="334.0" y="188.0"/> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="_40tMBi73EeS1AYtvYpBbmA" bpmnElement="_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE"> + <dc:Bounds height="80.0" width="100.0" x="189.0" y="188.0"/> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="_40tMBy73EeS1AYtvYpBbmA" bpmnElement="_054228DC-266F-4DA8-A63F-8C2695DCC2A2"> + <di:waypoint xsi:type="dc:Point" x="384.0" y="228.0"/> + <di:waypoint xsi:type="dc:Point" x="530.0" y="228.0"/> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="_40tMCC73EeS1AYtvYpBbmA" bpmnElement="_8289E931-8723-4DEB-A62C-6CAF91139B0B"> + <dc:Bounds height="80.0" width="100.0" x="480.0" y="188.0"/> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="_40tMCS73EeS1AYtvYpBbmA" bpmnElement="_E6F2E675-F1AB-4CE8-988F-845B9C345013"> + <di:waypoint xsi:type="dc:Point" x="645.0" y="228.0"/> + <di:waypoint xsi:type="dc:Point" x="645.0" y="125.0"/> + <di:waypoint xsi:type="dc:Point" x="239.0" y="125.0"/> + <di:waypoint xsi:type="dc:Point" x="239.0" y="228.0"/> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="_40tMCi73EeS1AYtvYpBbmA" bpmnElement="_DC97D697-E940-4E48-8185-6BA92FA94418"> + <dc:Bounds height="40.0" width="40.0" x="130.0" y="540.0"/> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="_40tzEC73EeS1AYtvYpBbmA" bpmnElement="_05393109-B58E-44C3-8BF2-00C4B2421310"> + <di:waypoint xsi:type="dc:Point" x="150.0" y="675.0"/> + <di:waypoint xsi:type="dc:Point" x="150.0" y="560.0"/> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="_40tzES73EeS1AYtvYpBbmA" bpmnElement="_5B1B9F91-15AE-48CA-BD3D-CE6A41DC9729"> + <dc:Bounds height="80.0" width="100.0" x="165.0" y="405.0"/> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="_40tzEi73EeS1AYtvYpBbmA" bpmnElement="_C3E3C56A-141C-4641-BB0E-C8D06D37F097"> + <di:waypoint xsi:type="dc:Point" x="150.0" y="560.0"/> + <di:waypoint xsi:type="dc:Point" x="215.0" y="560.0"/> + <di:waypoint xsi:type="dc:Point" x="215.0" y="445.0"/> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="_40tzEy73EeS1AYtvYpBbmA" bpmnElement="_AE358313-9923-47D4-8D7F-2BD2DBD3C726"> + <dc:Bounds height="80.0" width="100.0" x="30.0" y="405.0"/> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="_40tzFC73EeS1AYtvYpBbmA" bpmnElement="_4F965CA3-9A84-498F-A426-E5366BD31C5C"> + <di:waypoint xsi:type="dc:Point" x="150.0" y="560.0"/> + <di:waypoint xsi:type="dc:Point" x="80.0" y="560.0"/> + <di:waypoint xsi:type="dc:Point" x="80.0" y="445.0"/> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="_40tzFS73EeS1AYtvYpBbmA" bpmnElement="_3627B530-52F6-4EFC-B9D1-FC3D28F7BC13"> + <dc:Bounds height="40.0" width="40.0" x="130.0" y="315.0"/> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="_40tzFi73EeS1AYtvYpBbmA" bpmnElement="_2C144E08-F30C-4F06-B84D-A9A848B7F99D"> + <di:waypoint xsi:type="dc:Point" x="80.0" y="445.0"/> + <di:waypoint xsi:type="dc:Point" x="80.0" y="335.0"/> + <di:waypoint xsi:type="dc:Point" x="150.0" y="335.0"/> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="_40tzFy73EeS1AYtvYpBbmA" bpmnElement="_61243086-D25B-4C49-9E1B-D969A7BD6C2D"> + <di:waypoint xsi:type="dc:Point" x="215.0" y="445.0"/> + <di:waypoint xsi:type="dc:Point" x="215.0" y="335.0"/> + <di:waypoint xsi:type="dc:Point" x="150.0" y="335.0"/> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="_40tzGC73EeS1AYtvYpBbmA" bpmnElement="_34403A64-3974-4F36-83FE-9CE29EF57C00"> + <dc:Bounds height="28.0" width="28.0" x="1039.0" y="115.0"/> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="_40tzGS73EeS1AYtvYpBbmA" bpmnElement="_57C35252-FD8D-45A7-A81A-B69E548FD723"> + <di:waypoint xsi:type="dc:Point" x="1058.0" y="228.0"/> + <di:waypoint xsi:type="dc:Point" x="1053.0" y="129.0"/> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="_40tzGi73EeS1AYtvYpBbmA" bpmnElement="_D56D4095-0CB0-4E87-9A06-BF55B25904D1"> + <dc:Bounds height="40.0" width="40.0" x="625.0" y="208.0"/> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="_40tzGy73EeS1AYtvYpBbmA" bpmnElement="_4054B828-4EB8-4340-B318-90CC78EB1209"> + <di:waypoint xsi:type="dc:Point" x="530.0" y="228.0"/> + <di:waypoint xsi:type="dc:Point" x="645.0" y="228.0"/> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="_40tzHC73EeS1AYtvYpBbmA" bpmnElement="_3D7F7AE5-4420-4669-B415-E4BFF113E047"> + <dc:Bounds height="40.0" width="40.0" x="690.0" y="208.0"/> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="_40uaIC73EeS1AYtvYpBbmA" bpmnElement="_8B2D0306-7C68-466C-A192-D9637B1A2AC5"> + <di:waypoint xsi:type="dc:Point" x="645.0" y="228.0"/> + <di:waypoint xsi:type="dc:Point" x="710.0" y="228.0"/> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="_40uaIS73EeS1AYtvYpBbmA" bpmnElement="_53550CE0-4E1F-4171-AA2C-25D8599C2479"> + <dc:Bounds height="80.0" width="100.0" x="780.0" y="60.0"/> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="_40uaIi73EeS1AYtvYpBbmA" bpmnElement="_1827492A-0604-4974-A692-AF7D5CC78C14"> + <di:waypoint xsi:type="dc:Point" x="710.0" y="228.0"/> + <di:waypoint xsi:type="dc:Point" x="710.0" y="100.0"/> + <di:waypoint xsi:type="dc:Point" x="830.0" y="100.0"/> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="_40uaIy73EeS1AYtvYpBbmA" bpmnElement="_0DE2B5EE-4CC8-4FD6-972B-FC76C25FB43F"> + <dc:Bounds height="80.0" width="100.0" x="783.0" y="188.0"/> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="_40uaJC73EeS1AYtvYpBbmA" bpmnElement="_F50480EA-AC72-465F-B07C-7324B16B7F56"> + <di:waypoint xsi:type="dc:Point" x="710.0" y="228.0"/> + <di:waypoint xsi:type="dc:Point" x="833.0" y="228.0"/> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="_40uaJS73EeS1AYtvYpBbmA" bpmnElement="_E6E9EEFD-BDDF-4946-9FBF-85ABF92F72CC"> + <dc:Bounds height="80.0" width="100.0" x="783.0" y="315.0"/> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="_40uaJi73EeS1AYtvYpBbmA" bpmnElement="_1221DA43-76AB-4A51-9AE3-E423C47A9FF8"> + <di:waypoint xsi:type="dc:Point" x="710.0" y="228.0"/> + <di:waypoint xsi:type="dc:Point" x="710.0" y="355.0"/> + <di:waypoint xsi:type="dc:Point" x="833.0" y="355.0"/> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="_40uaJy73EeS1AYtvYpBbmA" bpmnElement="_F4ECF068-6E60-45A4-B6C9-E13C1F0ABF85"> + <dc:Bounds height="40.0" width="40.0" x="953.0" y="208.0"/> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="_40uaKC73EeS1AYtvYpBbmA" bpmnElement="_DB134771-8CD6-47FE-8843-75E730F194DC"> + <di:waypoint xsi:type="dc:Point" x="830.0" y="100.0"/> + <di:waypoint xsi:type="dc:Point" x="973.0" y="100.0"/> + <di:waypoint xsi:type="dc:Point" x="973.0" y="228.0"/> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="_40uaKS73EeS1AYtvYpBbmA" bpmnElement="_256806B5-18BF-45C6-BDFC-23B560A9DC1A"> + <di:waypoint xsi:type="dc:Point" x="833.0" y="228.0"/> + <di:waypoint xsi:type="dc:Point" x="973.0" y="228.0"/> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="_40uaKi73EeS1AYtvYpBbmA" bpmnElement="_19997DA4-320C-4F45-8859-0CB5CFBA33FE"> + <di:waypoint xsi:type="dc:Point" x="833.0" y="355.0"/> + <di:waypoint xsi:type="dc:Point" x="973.0" y="355.0"/> + <di:waypoint xsi:type="dc:Point" x="973.0" y="228.0"/> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="_40uaKy73EeS1AYtvYpBbmA" bpmnElement="_090E39D5-85C9-44D7-9BBC-0C3A91004BC0"> + <dc:Bounds height="40.0" width="40.0" x="1038.0" y="208.0"/> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="_40uaLC73EeS1AYtvYpBbmA" bpmnElement="_0B51E7E0-24E9-487F-94FA-5F178D5DC41D"> + <di:waypoint xsi:type="dc:Point" x="973.0" y="228.0"/> + <di:waypoint xsi:type="dc:Point" x="1058.0" y="228.0"/> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="_40uaLS73EeS1AYtvYpBbmA" bpmnElement="_60EE8970-2AC4-490C-9638-538EDF84F9F8"> + <dc:Bounds height="80.0" width="100.0" x="1123.0" y="188.0"/> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="_40vBMC73EeS1AYtvYpBbmA" bpmnElement="_4D029375-58C1-40B9-ABFB-6984240DAF2A"> + <di:waypoint xsi:type="dc:Point" x="1058.0" y="228.0"/> + <di:waypoint xsi:type="dc:Point" x="1173.0" y="228.0"/> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="_40vBMS73EeS1AYtvYpBbmA" bpmnElement="_9EF997A4-881E-401E-8D23-D4CC9317DFA9"> + <di:waypoint xsi:type="dc:Point" x="1173.0" y="228.0"/> + <di:waypoint xsi:type="dc:Point" x="1173.0" y="294.0"/> + <di:waypoint xsi:type="dc:Point" x="1058.0" y="294.0"/> + <di:waypoint xsi:type="dc:Point" x="1058.0" y="228.0"/> + </bpmndi:BPMNEdge> + </bpmndi:BPMNPlane> + </bpmndi:BPMNDiagram> + <bpmn2:relationship id="_40vBMi73EeS1AYtvYpBbmA" type="jBPMProcessSimulation"> + <bpmn2:extensionElements> + <drools:ProcessAnalysisData> + <drools:Scenario xsi:type="drools:Scenario" id="default" name="Simulationscenario"> + <drools:ScenarioParameters xsi:type="drools:ScenarioParameters_._type" baseTimeUnit="ms"/> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_4D029375-58C1-40B9-ABFB-6984240DAF2A" id="_40vBMy73EeS1AYtvYpBbmA"> + <drools:ControlParameters xsi:type="drools:ControlParameters"> + <drools:Probability xsi:type="drools:Parameter"> + <drools:FloatingParameter value="5.0"/> + </drools:Probability> + </drools:ControlParameters> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_2C144E08-F30C-4F06-B84D-A9A848B7F99D" id="_40vBNC73EeS1AYtvYpBbmA"> + <drools:ControlParameters xsi:type="drools:ControlParameters"> + <drools:Probability xsi:type="drools:Parameter"> + <drools:FloatingParameter value="100.0"/> + </drools:Probability> + </drools:ControlParameters> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_E6F2E675-F1AB-4CE8-988F-845B9C345013" id="_40vBNS73EeS1AYtvYpBbmA"> + <drools:ControlParameters xsi:type="drools:ControlParameters"> + <drools:Probability xsi:type="drools:Parameter"> + <drools:FloatingParameter value="7.0"/> + </drools:Probability> + </drools:ControlParameters> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_D0127BEA-43BE-4405-9CA6-1BB7B13A77D4" id="_40vBNi73EeS1AYtvYpBbmA"> + <drools:ControlParameters xsi:type="drools:ControlParameters"> + <drools:Probability xsi:type="drools:Parameter"> + <drools:FloatingParameter value="6.0"/> + </drools:Probability> + </drools:ControlParameters> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_4054B828-4EB8-4340-B318-90CC78EB1209" id="_40voQC73EeS1AYtvYpBbmA"> + <drools:ControlParameters xsi:type="drools:ControlParameters"> + <drools:Probability xsi:type="drools:Parameter"> + <drools:FloatingParameter value="100.0"/> + </drools:Probability> + </drools:ControlParameters> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_57C35252-FD8D-45A7-A81A-B69E548FD723" id="_40voQS73EeS1AYtvYpBbmA"> + <drools:ControlParameters xsi:type="drools:ControlParameters"> + <drools:Probability xsi:type="drools:Parameter"> + <drools:FloatingParameter value="100.0"/> + </drools:Probability> + </drools:ControlParameters> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_F50480EA-AC72-465F-B07C-7324B16B7F56" id="_40voQi73EeS1AYtvYpBbmA"> + <drools:ControlParameters xsi:type="drools:ControlParameters"> + <drools:Probability xsi:type="drools:Parameter"> + <drools:FloatingParameter value="100.0"/> + </drools:Probability> + </drools:ControlParameters> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_C3E3C56A-141C-4641-BB0E-C8D06D37F097" id="_40voQy73EeS1AYtvYpBbmA"> + <drools:ControlParameters xsi:type="drools:ControlParameters"> + <drools:Probability xsi:type="drools:Parameter"> + <drools:FloatingParameter value="60.0"/> + </drools:Probability> + </drools:ControlParameters> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_61243086-D25B-4C49-9E1B-D969A7BD6C2D" id="_40voRC73EeS1AYtvYpBbmA"> + <drools:ControlParameters xsi:type="drools:ControlParameters"> + <drools:Probability xsi:type="drools:Parameter"> + <drools:FloatingParameter value="100.0"/> + </drools:Probability> + </drools:ControlParameters> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_1827492A-0604-4974-A692-AF7D5CC78C14" id="_40voRS73EeS1AYtvYpBbmA"> + <drools:ControlParameters xsi:type="drools:ControlParameters"> + <drools:Probability xsi:type="drools:Parameter"> + <drools:FloatingParameter value="100.0"/> + </drools:Probability> + </drools:ControlParameters> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_AE358313-9923-47D4-8D7F-2BD2DBD3C726" id="_40voRi73EeS1AYtvYpBbmA"> + <drools:CostParameters xsi:type="drools:CostParameters"/> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_53550CE0-4E1F-4171-AA2C-25D8599C2479" id="_40voRy73EeS1AYtvYpBbmA"> + <drools:CostParameters xsi:type="drools:CostParameters"/> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_1221DA43-76AB-4A51-9AE3-E423C47A9FF8" id="_40voSC73EeS1AYtvYpBbmA"> + <drools:ControlParameters xsi:type="drools:ControlParameters"> + <drools:Probability xsi:type="drools:Parameter"> + <drools:FloatingParameter value="100.0"/> + </drools:Probability> + </drools:ControlParameters> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_0B51E7E0-24E9-487F-94FA-5F178D5DC41D" id="_40voSS73EeS1AYtvYpBbmA"> + <drools:ControlParameters xsi:type="drools:ControlParameters"> + <drools:Probability xsi:type="drools:Parameter"> + <drools:FloatingParameter value="100.0"/> + </drools:Probability> + </drools:ControlParameters> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_AD18FADA-4FFD-4F01-8BA1-98F9AF578DDE" id="_40voSi73EeS1AYtvYpBbmA"> + <drools:CostParameters xsi:type="drools:CostParameters"/> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_9EF997A4-881E-401E-8D23-D4CC9317DFA9" id="_40voSy73EeS1AYtvYpBbmA"> + <drools:ControlParameters xsi:type="drools:ControlParameters"> + <drools:Probability xsi:type="drools:Parameter"> + <drools:FloatingParameter value="100.0"/> + </drools:Probability> + </drools:ControlParameters> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_DB134771-8CD6-47FE-8843-75E730F194DC" id="_40wPUC73EeS1AYtvYpBbmA"> + <drools:ControlParameters xsi:type="drools:ControlParameters"> + <drools:Probability xsi:type="drools:Parameter"> + <drools:FloatingParameter value="100.0"/> + </drools:Probability> + </drools:ControlParameters> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_60EE8970-2AC4-490C-9638-538EDF84F9F8" id="_40wPUS73EeS1AYtvYpBbmA"> + <drools:CostParameters xsi:type="drools:CostParameters"/> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_5B1B9F91-15AE-48CA-BD3D-CE6A41DC9729" id="_40wPUi73EeS1AYtvYpBbmA"> + <drools:CostParameters xsi:type="drools:CostParameters"/> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_7A0D6B74-FB75-4981-B072-0A5131A2CE6E" id="_40wPUy73EeS1AYtvYpBbmA"> + <drools:CostParameters xsi:type="drools:CostParameters"/> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_A3BF1D3B-BA14-4641-A17E-124082F0B197" id="_40wPVC73EeS1AYtvYpBbmA"> + <drools:ControlParameters xsi:type="drools:ControlParameters"> + <drools:Probability xsi:type="drools:Parameter"> + <drools:FloatingParameter value="100.0"/> + </drools:Probability> + </drools:ControlParameters> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_05393109-B58E-44C3-8BF2-00C4B2421310" id="_40wPVS73EeS1AYtvYpBbmA"> + <drools:ControlParameters xsi:type="drools:ControlParameters"> + <drools:Probability xsi:type="drools:Parameter"> + <drools:FloatingParameter value="100.0"/> + </drools:Probability> + </drools:ControlParameters> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_E6E9EEFD-BDDF-4946-9FBF-85ABF92F72CC" id="_40wPVi73EeS1AYtvYpBbmA"> + <drools:CostParameters xsi:type="drools:CostParameters"/> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_19997DA4-320C-4F45-8859-0CB5CFBA33FE" id="_40wPVy73EeS1AYtvYpBbmA"> + <drools:ControlParameters xsi:type="drools:ControlParameters"> + <drools:Probability xsi:type="drools:Parameter"> + <drools:FloatingParameter value="100.0"/> + </drools:Probability> + </drools:ControlParameters> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_054228DC-266F-4DA8-A63F-8C2695DCC2A2" id="_40wPWC73EeS1AYtvYpBbmA"> + <drools:ControlParameters xsi:type="drools:ControlParameters"> + <drools:Probability xsi:type="drools:Parameter"> + <drools:FloatingParameter value="100.0"/> + </drools:Probability> + </drools:ControlParameters> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_4F965CA3-9A84-498F-A426-E5366BD31C5C" id="_40wPWS73EeS1AYtvYpBbmA"> + <drools:ControlParameters xsi:type="drools:ControlParameters"> + <drools:Probability xsi:type="drools:Parameter"> + <drools:FloatingParameter value="40.0"/> + </drools:Probability> + </drools:ControlParameters> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_256806B5-18BF-45C6-BDFC-23B560A9DC1A" id="_40wPWi73EeS1AYtvYpBbmA"> + <drools:ControlParameters xsi:type="drools:ControlParameters"> + <drools:Probability xsi:type="drools:Parameter"> + <drools:FloatingParameter value="100.0"/> + </drools:Probability> + </drools:ControlParameters> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_0DE2B5EE-4CC8-4FD6-972B-FC76C25FB43F" id="_40wPWy73EeS1AYtvYpBbmA"> + <drools:CostParameters xsi:type="drools:CostParameters"/> + </drools:ElementParameters> + <drools:ElementParameters xsi:type="drools:ElementParameters_._type" elementId="_8B2D0306-7C68-466C-A192-D9637B1A2AC5" id="_40wPXC73EeS1AYtvYpBbmA"> + <drools:ControlParameters xsi:type="drools:ControlParameters"> + <drools:Probability xsi:type="drools:Parameter"> + <drools:FloatingParameter value="100.0"/> + </drools:Probability> + </drools:ControlParameters> + </drools:ElementParameters> + </drools:Scenario> + </drools:ProcessAnalysisData> + </bpmn2:extensionElements> + <bpmn2:source>_40lQMS73EeS1AYtvYpBbmA</bpmn2:source> + <bpmn2:target>_40lQMS73EeS1AYtvYpBbmA</bpmn2:target> + </bpmn2:relationship> +</bpmn2:definitions> diff --git a/test/namespaces/test_namespaces_in_parsed_doc.rb b/test/namespaces/test_namespaces_in_parsed_doc.rb index 29342b59146..c4028150e2e 100644 --- a/test/namespaces/test_namespaces_in_parsed_doc.rb +++ b/test/namespaces/test_namespaces_in_parsed_doc.rb @@ -61,6 +61,20 @@ def test_parsed_namespace_count ns_attrs = n.to_xml.scan(/\bxmlns(?::.+?)?=/) assert_equal 3, ns_attrs.length end + + def test_namespaces_under_memory_pressure_issue1155 + skip("JRuby doesn't do GC.") if Nokogiri.jruby? + + # this test is here to emit warnings when run under valgrind + # see https://github.com/sparklemotion/nokogiri/issues/1155 for background + filename = File.join ASSETS_DIR, 'namespace_pressure_test.xml' + doc = Nokogiri::XML File.open(filename) + + # bizarrely, can't repro without the call to #to_a + doc.xpath('//namespace::*').to_a.each do |ns| + ns.inspect + end + end end end end From 395557b6056c8e7eb9811870e2cfacafa50d4a7a Mon Sep 17 00:00:00 2001 From: Mike Dalessio <mike.dalessio@gmail.com> Date: Wed, 30 Sep 2015 14:14:59 -0400 Subject: [PATCH 2/7] Reverting a portion of 2675a75 to stop freeing the namespace nodes when the NodeSet is GCed. Related to #1155 --- ext/nokogiri/xml_node_set.c | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/ext/nokogiri/xml_node_set.c b/ext/nokogiri/xml_node_set.c index 953982bd8e2..f0c59c5bd92 100644 --- a/ext/nokogiri/xml_node_set.c +++ b/ext/nokogiri/xml_node_set.c @@ -49,13 +49,10 @@ static void deallocate(nokogiriNodeSetTuple *tuple) return; NOKOGIRI_DEBUG_START(node_set) ; - st_foreach(tuple->namespaces, dealloc_namespace, 0); - if (node_set->nodeTab != NULL) xmlFree(node_set->nodeTab); xmlFree(node_set); - st_free_table(tuple->namespaces); free(tuple); NOKOGIRI_DEBUG_END(node_set) ; } @@ -420,24 +417,12 @@ VALUE Nokogiri_wrap_xml_node_set(xmlNodeSetPtr node_set, VALUE document) deallocate, tuple); tuple->node_set = node_set; - tuple->namespaces = st_init_numtable(); if (!NIL_P(document)) { rb_iv_set(new_set, "@document", document); rb_funcall(document, decorate, 1, new_set); } - if (node_set && node_set->nodeTab) { - for (i = 0; i < node_set->nodeNr; i++) { - cur = node_set->nodeTab[i]; - if (cur && cur->type == XML_NAMESPACE_DECL) { - ns = (xmlNsPtr)cur; - if (ns->next && ns->next->type != XML_NAMESPACE_DECL) - st_insert(tuple->namespaces, (st_data_t)cur, (st_data_t)0); - } - } - } - return new_set ; } From b46dc937aeebc5765de270a8452115aa581a117a Mon Sep 17 00:00:00 2001 From: Mike Dalessio <mike.dalessio@gmail.com> Date: Wed, 30 Sep 2015 15:16:24 -0400 Subject: [PATCH 3/7] Reverting a portion of 2675a75 to remove nokogiriNodeSetTuple which is no longer necessary Related to #1155 --- ext/nokogiri/xml_node_set.c | 170 +++++++++++++------------------ ext/nokogiri/xml_node_set.h | 4 - ext/nokogiri/xml_xpath_context.c | 15 ++- 3 files changed, 77 insertions(+), 112 deletions(-) diff --git a/ext/nokogiri/xml_node_set.c b/ext/nokogiri/xml_node_set.c index f0c59c5bd92..15caea8056a 100644 --- a/ext/nokogiri/xml_node_set.c +++ b/ext/nokogiri/xml_node_set.c @@ -13,7 +13,7 @@ static int dealloc_namespace(xmlNsPtr ns) return ST_CONTINUE; } -static void deallocate(nokogiriNodeSetTuple *tuple) +static void deallocate(xmlNodeSetPtr node_set) { /* * xmlXPathFreeNodeSet() contains an implicit assumption that it is being @@ -29,31 +29,13 @@ static void deallocate(nokogiriNodeSetTuple *tuple) * as a result, xmlXPathFreeNodeSet() will perform unsafe memory operations, * and calling it would be evil. * - * so here, we *manually* free the set of namespace nodes that was - * constructed at initialization time (see Nokogiri_wrap_xml_node_set()), as - * well as the NodeSet, without using the official xmlXPathFreeNodeSet(). - * - * there's probably a lesson in here somewhere about intermingling, within a - * single array, structs with different memory-ownership semantics. or more - * generally, a lesson about building an API in C/C++ that does not contain - * assumptions about the strict order in which memory will be released. hey, - * that sounds like a great idea for a blog post! get to it! - * * "In Valgrind We Trust." seriously. */ - xmlNodeSetPtr node_set; - - node_set = tuple->node_set; - - if (!node_set) - return; - NOKOGIRI_DEBUG_START(node_set) ; if (node_set->nodeTab != NULL) xmlFree(node_set->nodeTab); xmlFree(node_set); - free(tuple); NOKOGIRI_DEBUG_END(node_set) ; } @@ -71,12 +53,12 @@ static VALUE allocate(VALUE klass) */ static VALUE duplicate(VALUE self) { - nokogiriNodeSetTuple *tuple; + xmlNodeSetPtr node_set; xmlNodeSetPtr dupl; - Data_Get_Struct(self, nokogiriNodeSetTuple, tuple); + Data_Get_Struct(self, xmlNodeSet, node_set); - dupl = xmlXPathNodeSetMerge(NULL, tuple->node_set); + dupl = xmlXPathNodeSetMerge(NULL, node_set); return Nokogiri_wrap_xml_node_set(dupl, rb_iv_get(self, "@document")); } @@ -89,10 +71,11 @@ static VALUE duplicate(VALUE self) */ static VALUE length(VALUE self) { - nokogiriNodeSetTuple *tuple; - Data_Get_Struct(self, nokogiriNodeSetTuple, tuple); + xmlNodeSetPtr node_set; + + Data_Get_Struct(self, xmlNodeSet, node_set); - return tuple->node_set ? INT2NUM(tuple->node_set->nodeNr) : INT2NUM(0); + return node_set ? INT2NUM(node_set->nodeNr) : INT2NUM(0); } /* @@ -103,15 +86,17 @@ static VALUE length(VALUE self) */ static VALUE push(VALUE self, VALUE rb_node) { - nokogiriNodeSetTuple *tuple; + xmlNodeSetPtr node_set; xmlNodePtr node; if(!(rb_obj_is_kind_of(rb_node, cNokogiriXmlNode) || rb_obj_is_kind_of(rb_node, cNokogiriXmlNamespace))) rb_raise(rb_eArgError, "node must be a Nokogiri::XML::Node or Nokogiri::XML::Namespace"); - Data_Get_Struct(self, nokogiriNodeSetTuple, tuple); + Data_Get_Struct(self, xmlNodeSet, node_set); Data_Get_Struct(rb_node, xmlNode, node); - xmlXPathNodeSetAdd(tuple->node_set, node); + + xmlXPathNodeSetAdd(node_set, node); + return self; } @@ -125,29 +110,31 @@ static VALUE push(VALUE self, VALUE rb_node) static VALUE delete(VALUE self, VALUE rb_node) { - nokogiriNodeSetTuple *tuple; - xmlNodePtr node; - xmlNodeSetPtr cur; - int i; - - if (!(rb_obj_is_kind_of(rb_node, cNokogiriXmlNode) || rb_obj_is_kind_of(rb_node, cNokogiriXmlNamespace))) - rb_raise(rb_eArgError, "node must be a Nokogiri::XML::Node or Nokogiri::XML::Namespace"); - - Data_Get_Struct(self, nokogiriNodeSetTuple, tuple); - Data_Get_Struct(rb_node, xmlNode, node); - cur = tuple->node_set; - - if (xmlXPathNodeSetContains(cur, node)) { - for (i = 0; i < cur->nodeNr; i++) - if (cur->nodeTab[i] == node) break; - - cur->nodeNr--; - for (;i < cur->nodeNr;i++) - cur->nodeTab[i] = cur->nodeTab[i + 1]; - cur->nodeTab[cur->nodeNr] = NULL; - return rb_node; - } - return Qnil ; + xmlNodeSetPtr node_set; + xmlNodePtr node; + int j ; + + if (!(rb_obj_is_kind_of(rb_node, cNokogiriXmlNode) || rb_obj_is_kind_of(rb_node, cNokogiriXmlNamespace))) + rb_raise(rb_eArgError, "node must be a Nokogiri::XML::Node or Nokogiri::XML::Namespace"); + + Data_Get_Struct(self, xmlNodeSet, node_set); + Data_Get_Struct(rb_node, xmlNode, node); + + if (xmlXPathNodeSetContains(node_set, node)) { + /* + * this code is lifted from xmlXPathNodeSetDel(), and we're doing it because + * we want to avoid freeing the namespace nodes. + */ + for (j = 0; j < node_set->nodeNr; j++) + if (node_set->nodeTab[j] == node) break; + + node_set->nodeNr--; + for (;j < node_set->nodeNr;j++) + node_set->nodeTab[j] = node_set->nodeTab[j + 1]; + node_set->nodeTab[node_set->nodeNr] = NULL; + return rb_node; + } + return Qnil ; } @@ -159,16 +146,16 @@ delete(VALUE self, VALUE rb_node) */ static VALUE intersection(VALUE self, VALUE rb_other) { - nokogiriNodeSetTuple *tuple, *other; + xmlNodeSetPtr node_set, other ; xmlNodeSetPtr intersection; if(!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet)) rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet"); - Data_Get_Struct(self, nokogiriNodeSetTuple, tuple); - Data_Get_Struct(rb_other, nokogiriNodeSetTuple, other); + Data_Get_Struct(self, xmlNodeSet, node_set); + Data_Get_Struct(rb_other, xmlNodeSet, other); - intersection = xmlXPathIntersection(tuple->node_set, other->node_set); + intersection = xmlXPathIntersection(node_set, other); return Nokogiri_wrap_xml_node_set(intersection, rb_iv_get(self, "@document")); } @@ -181,16 +168,16 @@ static VALUE intersection(VALUE self, VALUE rb_other) */ static VALUE include_eh(VALUE self, VALUE rb_node) { - nokogiriNodeSetTuple *tuple; + xmlNodeSetPtr node_set; xmlNodePtr node; if(!(rb_obj_is_kind_of(rb_node, cNokogiriXmlNode) || rb_obj_is_kind_of(rb_node, cNokogiriXmlNamespace))) rb_raise(rb_eArgError, "node must be a Nokogiri::XML::Node or Nokogiri::XML::Namespace"); - Data_Get_Struct(self, nokogiriNodeSetTuple, tuple); + Data_Get_Struct(self, xmlNodeSet, node_set); Data_Get_Struct(rb_node, xmlNode, node); - return (xmlXPathNodeSetContains(tuple->node_set, node) ? Qtrue : Qfalse); + return (xmlXPathNodeSetContains(node_set, node) ? Qtrue : Qfalse); } @@ -203,17 +190,17 @@ static VALUE include_eh(VALUE self, VALUE rb_node) */ static VALUE set_union(VALUE self, VALUE rb_other) { - nokogiriNodeSetTuple *tuple, *other; + xmlNodeSetPtr node_set, other; xmlNodeSetPtr new; if(!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet)) rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet"); - Data_Get_Struct(self, nokogiriNodeSetTuple, tuple); - Data_Get_Struct(rb_other, nokogiriNodeSetTuple, other); + Data_Get_Struct(self, xmlNodeSet, node_set); + Data_Get_Struct(rb_other, xmlNodeSet, other); - new = xmlXPathNodeSetMerge(NULL, tuple->node_set); - new = xmlXPathNodeSetMerge(new, other->node_set); + new = xmlXPathNodeSetMerge(NULL, node_set); + new = xmlXPathNodeSetMerge(new, other); return Nokogiri_wrap_xml_node_set(new, rb_iv_get(self, "@document")); } @@ -227,19 +214,19 @@ static VALUE set_union(VALUE self, VALUE rb_other) */ static VALUE minus(VALUE self, VALUE rb_other) { - nokogiriNodeSetTuple *tuple, *other; + xmlNodeSetPtr node_set, other; xmlNodeSetPtr new; int j ; if(!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet)) rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet"); - Data_Get_Struct(self, nokogiriNodeSetTuple, tuple); - Data_Get_Struct(rb_other, nokogiriNodeSetTuple, other); + Data_Get_Struct(self, xmlNodeSet, node_set); + Data_Get_Struct(rb_other, xmlNodeSet, other); - new = xmlXPathNodeSetMerge(NULL, tuple->node_set); - for (j = 0 ; j < other->node_set->nodeNr ; ++j) { - xmlXPathNodeSetDel(new, other->node_set->nodeTab[j]); + new = xmlXPathNodeSetMerge(NULL, node_set); + for (j = 0 ; j < other->nodeNr ; ++j) { + xmlXPathNodeSetDel(new, other->nodeTab[j]); /* TODO namespace delete issue! */ } return Nokogiri_wrap_xml_node_set(new, rb_iv_get(self, "@document")); @@ -249,10 +236,8 @@ static VALUE minus(VALUE self, VALUE rb_other) static VALUE index_at(VALUE self, long offset) { xmlNodeSetPtr node_set; - nokogiriNodeSetTuple *tuple; - Data_Get_Struct(self, nokogiriNodeSetTuple, tuple); - node_set = tuple->node_set; + Data_Get_Struct(self, xmlNodeSet, node_set); if (offset >= node_set->nodeNr || abs((int)offset) > node_set->nodeNr) return Qnil; @@ -268,12 +253,10 @@ static VALUE index_at(VALUE self, long offset) static VALUE subseq(VALUE self, long beg, long len) { long j; - nokogiriNodeSetTuple *tuple; xmlNodeSetPtr node_set; xmlNodeSetPtr new_set ; - Data_Get_Struct(self, nokogiriNodeSetTuple, tuple); - node_set = tuple->node_set; + Data_Get_Struct(self, xmlNodeSet, node_set); if (beg > node_set->nodeNr) return Qnil ; if (beg < 0 || len < 0) return Qnil ; @@ -309,9 +292,8 @@ static VALUE slice(int argc, VALUE *argv, VALUE self) VALUE arg ; long beg, len ; xmlNodeSetPtr node_set; - nokogiriNodeSetTuple *tuple; - Data_Get_Struct(self, nokogiriNodeSetTuple, tuple); - node_set = tuple->node_set; + + Data_Get_Struct(self, xmlNodeSet, node_set); if (argc == 2) { beg = NUM2LONG(argv[0]); @@ -353,24 +335,22 @@ static VALUE slice(int argc, VALUE *argv, VALUE self) */ static VALUE to_array(VALUE self, VALUE rb_node) { - xmlNodeSetPtr set; + xmlNodeSetPtr node_set ; VALUE *elts; VALUE list; int i; - nokogiriNodeSetTuple *tuple; - Data_Get_Struct(self, nokogiriNodeSetTuple, tuple); - set = tuple->node_set; + Data_Get_Struct(self, xmlNodeSet, node_set); - elts = calloc((size_t)set->nodeNr, sizeof(VALUE *)); - for(i = 0; i < set->nodeNr; i++) { - if (XML_NAMESPACE_DECL == set->nodeTab[i]->type) - elts[i] = Nokogiri_wrap_xml_namespace2(rb_iv_get(self, "@document"), (xmlNsPtr)(set->nodeTab[i])); + elts = calloc((size_t)node_set->nodeNr, sizeof(VALUE *)); + for(i = 0; i < node_set->nodeNr; i++) { + if (XML_NAMESPACE_DECL == node_set->nodeTab[i]->type) + elts[i] = Nokogiri_wrap_xml_namespace2(rb_iv_get(self, "@document"), (xmlNsPtr)(node_set->nodeTab[i])); else - elts[i] = Nokogiri_wrap_xml_node(Qnil, set->nodeTab[i]); + elts[i] = Nokogiri_wrap_xml_node(Qnil, node_set->nodeTab[i]); } - list = rb_ary_new4((long)set->nodeNr, elts); + list = rb_ary_new4((long)node_set->nodeNr, elts); /*free(elts); */ @@ -387,10 +367,9 @@ static VALUE unlink_nodeset(VALUE self) { xmlNodeSetPtr node_set; int j, nodeNr ; - nokogiriNodeSetTuple *tuple; - Data_Get_Struct(self, nokogiriNodeSetTuple, tuple); - node_set = tuple->node_set; + Data_Get_Struct(self, xmlNodeSet, node_set); + nodeNr = node_set->nodeNr ; for (j = 0 ; j < nodeNr ; j++) { if (XML_NAMESPACE_DECL != node_set->nodeTab[j]->type) { @@ -408,15 +387,8 @@ static VALUE unlink_nodeset(VALUE self) VALUE Nokogiri_wrap_xml_node_set(xmlNodeSetPtr node_set, VALUE document) { VALUE new_set ; - int i; - xmlNodePtr cur; - xmlNsPtr ns; - nokogiriNodeSetTuple *tuple; - - new_set = Data_Make_Struct(cNokogiriXmlNodeSet, nokogiriNodeSetTuple, 0, - deallocate, tuple); - tuple->node_set = node_set; + new_set = Data_Wrap_Struct(cNokogiriXmlNodeSet, 0, deallocate, node_set); if (!NIL_P(document)) { rb_iv_set(new_set, "@document", document); diff --git a/ext/nokogiri/xml_node_set.h b/ext/nokogiri/xml_node_set.h index e48cc997cf5..fa3588f8981 100644 --- a/ext/nokogiri/xml_node_set.h +++ b/ext/nokogiri/xml_node_set.h @@ -7,8 +7,4 @@ void init_xml_node_set(); extern VALUE cNokogiriXmlNodeSet ; VALUE Nokogiri_wrap_xml_node_set(xmlNodeSetPtr node_set, VALUE document) ; -typedef struct _nokogiriNodeSetTuple { - xmlNodeSetPtr node_set; - st_table *namespaces; -} nokogiriNodeSetTuple; #endif diff --git a/ext/nokogiri/xml_xpath_context.c b/ext/nokogiri/xml_xpath_context.c index 25e43aa9945..bdcfcc754f3 100644 --- a/ext/nokogiri/xml_xpath_context.c +++ b/ext/nokogiri/xml_xpath_context.c @@ -57,7 +57,6 @@ void Nokogiri_marshal_xpath_funcall_and_return_values(xmlXPathParserContextPtr c VALUE node_set = Qnil; xmlNodeSetPtr xml_node_set = NULL; xmlXPathObjectPtr obj; - nokogiriNodeSetTuple *node_set_tuple; assert(ctx->context->doc); assert(DOC_RUBY_OBJECT_TEST(ctx->context->doc)); @@ -123,25 +122,23 @@ void Nokogiri_marshal_xpath_funcall_and_return_values(xmlXPathParserContextPtr c case T_ARRAY: { VALUE args[2]; - args[0] = doc; - args[1] = result; + args[0] = doc; + args[1] = result; node_set = rb_class_new_instance(2, args, cNokogiriXmlNodeSet); - Data_Get_Struct(node_set, nokogiriNodeSetTuple, node_set_tuple); - xml_node_set = node_set_tuple->node_set; + Data_Get_Struct(node_set, xmlNodeSet, xml_node_set); xmlXPathReturnNodeSet(ctx, xmlXPathNodeSetMerge(NULL, xml_node_set)); } - break; + break; case T_DATA: if(rb_obj_is_kind_of(result, cNokogiriXmlNodeSet)) { - Data_Get_Struct(result, nokogiriNodeSetTuple, node_set_tuple); - xml_node_set = node_set_tuple->node_set; + Data_Get_Struct(result, xmlNodeSet, xml_node_set); /* Copy the node set, otherwise it will get GC'd. */ xmlXPathReturnNodeSet(ctx, xmlXPathNodeSetMerge(NULL, xml_node_set)); break; } default: rb_raise(rb_eRuntimeError, "Invalid return type"); - } + } } static void ruby_funcall(xmlXPathParserContextPtr ctx, int nargs) From 3cd1c04a182a8e0e9113b89ef16177d11ec581c6 Mon Sep 17 00:00:00 2001 From: Mike Dalessio <mike.dalessio@gmail.com> Date: Thu, 1 Oct 2015 11:28:46 -0400 Subject: [PATCH 4/7] Nokogiri_wrap_xml_node_set handles NULL This allows us to move repeated NULL checks out of callers. --- ext/nokogiri/xml_node_set.c | 4 ++++ ext/nokogiri/xml_xpath_context.c | 12 +++--------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/ext/nokogiri/xml_node_set.c b/ext/nokogiri/xml_node_set.c index 15caea8056a..c6d9d7fe593 100644 --- a/ext/nokogiri/xml_node_set.c +++ b/ext/nokogiri/xml_node_set.c @@ -388,6 +388,10 @@ VALUE Nokogiri_wrap_xml_node_set(xmlNodeSetPtr node_set, VALUE document) { VALUE new_set ; + if (node_set == NULL) { + node_set = xmlXPathNodeSetCreate(NULL); + } + new_set = Data_Wrap_Struct(cNokogiriXmlNodeSet, 0, deallocate, node_set); if (!NIL_P(document)) { diff --git a/ext/nokogiri/xml_xpath_context.c b/ext/nokogiri/xml_xpath_context.c index bdcfcc754f3..c98ec6ef4a2 100644 --- a/ext/nokogiri/xml_xpath_context.c +++ b/ext/nokogiri/xml_xpath_context.c @@ -233,13 +233,8 @@ static VALUE evaluate(int argc, VALUE *argv, VALUE self) xmlFree(xpath->stringval); break; case XPATH_NODESET: - if(NULL == xpath->nodesetval) { - thing = Nokogiri_wrap_xml_node_set(xmlXPathNodeSetCreate(NULL), - DOC_RUBY_OBJECT(ctx->doc)); - } else { - thing = Nokogiri_wrap_xml_node_set(xpath->nodesetval, - DOC_RUBY_OBJECT(ctx->doc)); - } + thing = Nokogiri_wrap_xml_node_set(xpath->nodesetval, + DOC_RUBY_OBJECT(ctx->doc)); break; case XPATH_NUMBER: thing = rb_float_new(xpath->floatval); @@ -248,8 +243,7 @@ static VALUE evaluate(int argc, VALUE *argv, VALUE self) thing = xpath->boolval == 1 ? Qtrue : Qfalse; break; default: - thing = Nokogiri_wrap_xml_node_set(xmlXPathNodeSetCreate(NULL), - DOC_RUBY_OBJECT(ctx->doc)); + thing = Nokogiri_wrap_xml_node_set(NULL, DOC_RUBY_OBJECT(ctx->doc)); } xmlXPathFreeNodeSetList(xpath); From af7ccbafea0d9d81afe8f5ba78a028968d4c6f64 Mon Sep 17 00:00:00 2001 From: Mike Dalessio <mike.dalessio@gmail.com> Date: Thu, 1 Oct 2015 11:36:49 -0400 Subject: [PATCH 5/7] DRY up type checks in xml_node_set.c introduce Check_Node_Set_Node_Type to replace repeated logic. --- ext/nokogiri/xml_node_set.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/ext/nokogiri/xml_node_set.c b/ext/nokogiri/xml_node_set.c index c6d9d7fe593..29ea8488140 100644 --- a/ext/nokogiri/xml_node_set.c +++ b/ext/nokogiri/xml_node_set.c @@ -3,16 +3,16 @@ static ID decorate ; -static int dealloc_namespace(xmlNsPtr ns) + +static void Check_Node_Set_Node_Type(VALUE node) { - if (ns->href) - xmlFree((xmlChar *)ns->href); - if (ns->prefix) - xmlFree((xmlChar *)ns->prefix); - xmlFree(ns); - return ST_CONTINUE; + if (!(rb_obj_is_kind_of(node, cNokogiriXmlNode) || + rb_obj_is_kind_of(node, cNokogiriXmlNamespace))) { + rb_raise(rb_eArgError, "node must be a Nokogiri::XML::Node or Nokogiri::XML::Namespace"); + } } + static void deallocate(xmlNodeSetPtr node_set) { /* @@ -89,8 +89,7 @@ static VALUE push(VALUE self, VALUE rb_node) xmlNodeSetPtr node_set; xmlNodePtr node; - if(!(rb_obj_is_kind_of(rb_node, cNokogiriXmlNode) || rb_obj_is_kind_of(rb_node, cNokogiriXmlNamespace))) - rb_raise(rb_eArgError, "node must be a Nokogiri::XML::Node or Nokogiri::XML::Namespace"); + Check_Node_Set_Node_Type(rb_node); Data_Get_Struct(self, xmlNodeSet, node_set); Data_Get_Struct(rb_node, xmlNode, node); @@ -114,8 +113,7 @@ delete(VALUE self, VALUE rb_node) xmlNodePtr node; int j ; - if (!(rb_obj_is_kind_of(rb_node, cNokogiriXmlNode) || rb_obj_is_kind_of(rb_node, cNokogiriXmlNamespace))) - rb_raise(rb_eArgError, "node must be a Nokogiri::XML::Node or Nokogiri::XML::Namespace"); + Check_Node_Set_Node_Type(rb_node); Data_Get_Struct(self, xmlNodeSet, node_set); Data_Get_Struct(rb_node, xmlNode, node); @@ -171,8 +169,7 @@ static VALUE include_eh(VALUE self, VALUE rb_node) xmlNodeSetPtr node_set; xmlNodePtr node; - if(!(rb_obj_is_kind_of(rb_node, cNokogiriXmlNode) || rb_obj_is_kind_of(rb_node, cNokogiriXmlNamespace))) - rb_raise(rb_eArgError, "node must be a Nokogiri::XML::Node or Nokogiri::XML::Namespace"); + Check_Node_Set_Node_Type(rb_node); Data_Get_Struct(self, xmlNodeSet, node_set); Data_Get_Struct(rb_node, xmlNode, node); From 56d62e0c8fddae0e4d57345a19e5abd83addc627 Mon Sep 17 00:00:00 2001 From: Mike Dalessio <mike.dalessio@gmail.com> Date: Thu, 1 Oct 2015 11:39:11 -0400 Subject: [PATCH 6/7] normalize how we remove nodes from a node set previously we had one code path (in #minus) that might try to free xmlNs structs in the xmlNodeset. --- ext/nokogiri/xml_node_set.c | 48 +++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/ext/nokogiri/xml_node_set.c b/ext/nokogiri/xml_node_set.c index 29ea8488140..e31cde724dc 100644 --- a/ext/nokogiri/xml_node_set.c +++ b/ext/nokogiri/xml_node_set.c @@ -2,6 +2,7 @@ #include <libxml/xpathInternals.h> static ID decorate ; +static void xpath_node_set_del(xmlNodeSetPtr cur, xmlNodePtr val); static void Check_Node_Set_Node_Type(VALUE node) @@ -119,17 +120,7 @@ delete(VALUE self, VALUE rb_node) Data_Get_Struct(rb_node, xmlNode, node); if (xmlXPathNodeSetContains(node_set, node)) { - /* - * this code is lifted from xmlXPathNodeSetDel(), and we're doing it because - * we want to avoid freeing the namespace nodes. - */ - for (j = 0; j < node_set->nodeNr; j++) - if (node_set->nodeTab[j] == node) break; - - node_set->nodeNr--; - for (;j < node_set->nodeNr;j++) - node_set->nodeTab[j] = node_set->nodeTab[j + 1]; - node_set->nodeTab[node_set->nodeNr] = NULL; + xpath_node_set_del(node_set, node); return rb_node; } return Qnil ; @@ -223,7 +214,7 @@ static VALUE minus(VALUE self, VALUE rb_other) new = xmlXPathNodeSetMerge(NULL, node_set); for (j = 0 ; j < other->nodeNr ; ++j) { - xmlXPathNodeSetDel(new, other->nodeTab[j]); /* TODO namespace delete issue! */ + xpath_node_set_del(new, other->nodeTab[j]); } return Nokogiri_wrap_xml_node_set(new, rb_iv_get(self, "@document")); @@ -396,9 +387,42 @@ VALUE Nokogiri_wrap_xml_node_set(xmlNodeSetPtr node_set, VALUE document) rb_funcall(document, decorate, 1, new_set); } + rb_iv_set(new_set, "@namespace_cache", rb_ary_new()); + reify_node_set_namespaces(new_set); + return new_set ; } +static void xpath_node_set_del(xmlNodeSetPtr cur, xmlNodePtr val) +{ + /* + * as mentioned a few times above, we do not want to free xmlNs structs + * outside of the Namespace lifecycle. + * + * xmlXPathNodeSetDel() frees xmlNs structs, and so here we reproduce that + * function with the xmlNs logic. + */ + int i; + + if (cur == NULL) return; + if (val == NULL) return; + + /* + * find node in nodeTab + */ + for (i = 0;i < cur->nodeNr;i++) + if (cur->nodeTab[i] == val) break; + + if (i >= cur->nodeNr) { /* not found */ + return; + } + cur->nodeNr--; + for (;i < cur->nodeNr;i++) + cur->nodeTab[i] = cur->nodeTab[i + 1]; + cur->nodeTab[cur->nodeNr] = NULL; +} + + VALUE cNokogiriXmlNodeSet ; void init_xml_node_set(void) { From 8ec407d0245853e3a31ca5ff45f4c20c9b41ad30 Mon Sep 17 00:00:00 2001 From: Mike Dalessio <mike.dalessio@gmail.com> Date: Thu, 1 Oct 2015 11:42:04 -0400 Subject: [PATCH 7/7] Fix memory management of xmlNs xpath results this commit introduces a bifurcation in how Namespace objects are managed; Namespace objects wrapped around xmlNs structs from an xpath query now have their own Ruby object lifecycle and are GCed independently from their original document. See comments in xml_node_set.c and xml_namespace.c for more details. Related to #1155 --- ext/nokogiri/xml_namespace.c | 62 ++++++++++++++++++----- ext/nokogiri/xml_node_set.c | 96 ++++++++++++++++++++++++++---------- ext/nokogiri/xml_node_set.h | 3 ++ 3 files changed, 122 insertions(+), 39 deletions(-) diff --git a/ext/nokogiri/xml_namespace.c b/ext/nokogiri/xml_namespace.c index 44bb25657fb..af18fdf87b5 100644 --- a/ext/nokogiri/xml_namespace.c +++ b/ext/nokogiri/xml_namespace.c @@ -2,6 +2,34 @@ VALUE cNokogiriXmlNamespace ; +static void dealloc_namespace(xmlNsPtr ns) +{ + /* + * + * this deallocator is only used for namespace nodes that are part of an xpath + * node set. + * + * see Nokogiri_wrap_xml_namespace() for more details. + * + */ + NOKOGIRI_DEBUG_START(ns) ; + if (ns->href) { + xmlFree((xmlChar *)ns->href); + } + if (ns->prefix) { + xmlFree((xmlChar *)ns->prefix); + } + xmlFree(ns); + NOKOGIRI_DEBUG_END(ns) ; +} + + +int Nokogiri_namespace_eh(xmlNodePtr node) +{ + return (node->type == XML_NAMESPACE_DECL); +} + + /* * call-seq: * prefix @@ -34,21 +62,37 @@ static VALUE href(VALUE self) return NOKOGIRI_STR_NEW2(ns->href); } +static int part_of_an_xpath_node_set_eh(xmlNsPtr node) +{ + return (node->next && ! Nokogiri_namespace_eh(node->next)); +} + VALUE Nokogiri_wrap_xml_namespace(xmlDocPtr doc, xmlNsPtr node) { VALUE ns, document, node_cache; + assert(doc->type == XML_DOCUMENT_NODE || doc->type == XML_HTML_DOCUMENT_NODE); assert(doc->_private); - if(node->_private) + if (node->_private) { return (VALUE)node->_private; - - ns = Data_Wrap_Struct(cNokogiriXmlNamespace, 0, 0, node); + } document = DOC_RUBY_OBJECT(doc); - node_cache = rb_iv_get(document, "@node_cache"); - rb_ary_push(node_cache, ns); + if (part_of_an_xpath_node_set_eh(node)) { + /* + * this is a duplicate returned as part of an xpath query node set, and so + * we need to make sure we manage this memory. + * + * see comments in xml_node_set.c for more details. + */ + ns = Data_Wrap_Struct(cNokogiriXmlNamespace, 0, dealloc_namespace, node); + } else { + ns = Data_Wrap_Struct(cNokogiriXmlNamespace, 0, 0, node); + node_cache = rb_iv_get(document, "@node_cache"); + rb_ary_push(node_cache, ns); + } rb_iv_set(ns, "@document", DOC_RUBY_OBJECT(doc)); @@ -57,14 +101,6 @@ VALUE Nokogiri_wrap_xml_namespace(xmlDocPtr doc, xmlNsPtr node) return ns; } -VALUE Nokogiri_wrap_xml_namespace2(VALUE document, xmlNsPtr node) -{ - xmlDocPtr doc; - Data_Get_Struct(document, xmlDoc, doc) ; - return Nokogiri_wrap_xml_namespace(doc, node); -} - - void init_xml_namespace() { VALUE nokogiri = rb_define_module("Nokogiri"); diff --git a/ext/nokogiri/xml_node_set.c b/ext/nokogiri/xml_node_set.c index e31cde724dc..bbf4c846d6b 100644 --- a/ext/nokogiri/xml_node_set.c +++ b/ext/nokogiri/xml_node_set.c @@ -1,4 +1,5 @@ #include <xml_node_set.h> +#include <xml_namespace.h> #include <libxml/xpathInternals.h> static ID decorate ; @@ -17,20 +18,19 @@ static void Check_Node_Set_Node_Type(VALUE node) static void deallocate(xmlNodeSetPtr node_set) { /* - * xmlXPathFreeNodeSet() contains an implicit assumption that it is being - * called before any of its pointed-to nodes have been free()d. this - * assumption lies in the operation where it dereferences nodeTab pointers - * while searching for namespace nodes to free. * - * however, since Ruby's GC mechanism cannot guarantee the strict order in - * which ruby objects will be GC'd, nodes may be garbage collected before a - * nodeset containing pointers to those nodes. (this is true regardless of - * how we declare dependencies between objects with rb_gc_mark().) + * since xpath queries return copies of the xmlNs structs, + * xmlXPathFreeNodeSet() frees those xmlNs structs that are in the + * NodeSet. * - * as a result, xmlXPathFreeNodeSet() will perform unsafe memory operations, - * and calling it would be evil. + * this is bad if someone is still trying to use the Namespace object wrapped + * around the xmlNs, so we need to avoid that. * - * "In Valgrind We Trust." seriously. + * here we reproduce xmlXPathFreeNodeSet() without the xmlNs logic. + * + * this doesn't cause a leak because Namespace objects that are in an XPath + * query NodeSet are given their own lifecycle in + * Nokogiri_wrap_xml_namespace(). */ NOKOGIRI_DEBUG_START(node_set) ; if (node_set->nodeTab != NULL) @@ -112,7 +112,6 @@ delete(VALUE self, VALUE rb_node) { xmlNodeSetPtr node_set; xmlNodePtr node; - int j ; Check_Node_Set_Node_Type(rb_node); @@ -227,15 +226,13 @@ static VALUE index_at(VALUE self, long offset) Data_Get_Struct(self, xmlNodeSet, node_set); - if (offset >= node_set->nodeNr || abs((int)offset) > node_set->nodeNr) + if (offset >= node_set->nodeNr || abs((int)offset) > node_set->nodeNr) { return Qnil; + } - if (offset < 0) - offset += node_set->nodeNr; + if (offset < 0) { offset += node_set->nodeNr ; } - if (XML_NAMESPACE_DECL == node_set->nodeTab[offset]->type) - return Nokogiri_wrap_xml_namespace2(rb_iv_get(self, "@document"), (xmlNsPtr)(node_set->nodeTab[offset])); - return Nokogiri_wrap_xml_node(Qnil, node_set->nodeTab[offset]); + return Nokogiri_wrap_xml_node_set_node(node_set->nodeTab[offset], self); } static VALUE subseq(VALUE self, long beg, long len) @@ -300,7 +297,7 @@ static VALUE slice(int argc, VALUE *argv, VALUE self) if (FIXNUM_P(arg)) { return index_at(self, FIX2LONG(arg)); } - + /* if arg is Range */ switch (rb_range_beg_len(arg, &beg, &len, (long)node_set->nodeNr, 0)) { case Qfalse: @@ -330,17 +327,18 @@ static VALUE to_array(VALUE self, VALUE rb_node) Data_Get_Struct(self, xmlNodeSet, node_set); - elts = calloc((size_t)node_set->nodeNr, sizeof(VALUE *)); + elts = (VALUE *)calloc((size_t)(node_set->nodeNr), sizeof(VALUE)); for(i = 0; i < node_set->nodeNr; i++) { - if (XML_NAMESPACE_DECL == node_set->nodeTab[i]->type) - elts[i] = Nokogiri_wrap_xml_namespace2(rb_iv_get(self, "@document"), (xmlNsPtr)(node_set->nodeTab[i])); - else - elts[i] = Nokogiri_wrap_xml_node(Qnil, node_set->nodeTab[i]); + elts[i] = Nokogiri_wrap_xml_node_set_node(node_set->nodeTab[i], self); + rb_gc_register_address(&elts[i]); } list = rb_ary_new4((long)node_set->nodeNr, elts); - /*free(elts); */ + for(i = 0; i < node_set->nodeNr; i++) { + rb_gc_unregister_address(&elts[i]); + } + free(elts); return list; } @@ -360,7 +358,7 @@ static VALUE unlink_nodeset(VALUE self) nodeNr = node_set->nodeNr ; for (j = 0 ; j < nodeNr ; j++) { - if (XML_NAMESPACE_DECL != node_set->nodeTab[j]->type) { + if (! Nokogiri_namespace_eh(node_set->nodeTab[j])) { VALUE node ; xmlNodePtr node_ptr; node = Nokogiri_wrap_xml_node(Qnil, node_set->nodeTab[j]); @@ -372,6 +370,39 @@ static VALUE unlink_nodeset(VALUE self) return self ; } + +static void reify_node_set_namespaces(VALUE self) +{ + /* + * as mentioned in deallocate() above, xmlNs structs returned in an XPath + * NodeSet are duplicates, and we don't clean them up at deallocate() time. + * + * as a result, we need to make sure the Ruby manages this memory. we do this + * by forcing the creation of a Ruby object wrapped around the xmlNs. + * + * we also have to make sure that the NodeSet has a reference to the + * Namespace object, otherwise GC will kick in and the Namespace won't be + * marked. + * + * we *could* do this safely with *all* the nodes in the NodeSet, but we only + * *need* to do it for xmlNs structs, and so you get the code we have here. + */ + int j ; + xmlNodeSetPtr node_set ; + VALUE namespace_cache ; + + Data_Get_Struct(self, xmlNodeSet, node_set); + + namespace_cache = rb_iv_get(self, "@namespace_cache"); + + for (j = 0 ; j < node_set->nodeNr ; j++) { + if (Nokogiri_namespace_eh(node_set->nodeTab[j])) { + rb_ary_push(namespace_cache, Nokogiri_wrap_xml_node_set_node(node_set->nodeTab[j], self)); + } + } +} + + VALUE Nokogiri_wrap_xml_node_set(xmlNodeSetPtr node_set, VALUE document) { VALUE new_set ; @@ -393,6 +424,19 @@ VALUE Nokogiri_wrap_xml_node_set(xmlNodeSetPtr node_set, VALUE document) return new_set ; } +VALUE Nokogiri_wrap_xml_node_set_node(xmlNodePtr node, VALUE node_set) +{ + xmlDocPtr document ; + + if (Nokogiri_namespace_eh(node)) { + Data_Get_Struct(rb_iv_get(node_set, "@document"), xmlDoc, document); + return Nokogiri_wrap_xml_namespace(document, (xmlNsPtr)node); + } else { + return Nokogiri_wrap_xml_node(Qnil, node); + } +} + + static void xpath_node_set_del(xmlNodeSetPtr cur, xmlNodePtr val) { /* diff --git a/ext/nokogiri/xml_node_set.h b/ext/nokogiri/xml_node_set.h index fa3588f8981..02a688cfe60 100644 --- a/ext/nokogiri/xml_node_set.h +++ b/ext/nokogiri/xml_node_set.h @@ -6,5 +6,8 @@ void init_xml_node_set(); extern VALUE cNokogiriXmlNodeSet ; VALUE Nokogiri_wrap_xml_node_set(xmlNodeSetPtr node_set, VALUE document) ; +VALUE Nokogiri_wrap_xml_node_set_node(xmlNodePtr node, VALUE node_set) ; +VALUE Nokogiri_wrap_xml_node_set_namespace(xmlNsPtr node, VALUE node_set) ; +int Nokogiri_namespace_eh(xmlNodePtr node) ; #endif