mida
Version:
Muiltiple Instance and Data Animator for BPMN models.
167 lines (143 loc) • 5.2 kB
JavaScript
;
var is = require('../../../util/ElementHelper').is;
var events = require('../../../util/EventHelper'), CONSUME_TOKEN_EVENT = events.CONSUME_TOKEN_EVENT, GENERATE_TOKEN_EVENT = events.GENERATE_TOKEN_EVENT;
var tokens = require('../TokenSimulationBehavior');
function InclusiveGatewayHandler(animation, eventBus) {
this._animation = animation;
this._eventBus = eventBus;
};
InclusiveGatewayHandler.prototype.consume = function(context) {
var element = context.element, processInstanceId = context.processInstanceId;
if (!element.tokenCount) {
element.tokenCount = {};
}
if (!element.tokenCount[processInstanceId]) {
element.tokenCount[processInstanceId] = 0;
}
element.tokenCount[processInstanceId]++;
var self = this;
var outgoingSequenceFlows = element.outgoing.filter(function(outgoing) {
return is(outgoing, 'bpmn:SequenceFlow');
});
var incomingSequenceFlows = element.incoming.filter(function(incoming) {
return is(incoming, 'bpmn:SequenceFlow');
});
if (Object.keys(outgoingSequenceFlows).length === 1) {
var isActive = true;
// DEFINIRE ISACTIVE
var tokenDistribution = window.tokenDistribution.get(processInstanceId);
// remove token to each incoming sequence flow
var incomingSequenceFlows = element.incoming.filter(function(incoming) {
return is(incoming, 'bpmn:SequenceFlow');
});
var xml;
var viewer = window.viewer;
if (!viewer) {
viewer = window.modeler;
}
viewer.moddle.toXML(viewer.definitions, {
format : true
}, function(err, updatedXML) {
xml = updatedXML;
});
var orJoin = element.businessObject.id;
var tokensDist = "";
var count = false;
tokenDistribution.forEach(function(value, key, map) {
if (window.tokenDistribution.get(key) > 0) {
if (count === true) {
tokensDist += ";" + key.businessObject.id;
} else {
tokensDist += "" + key.businessObject.id;
count = true;
}
}
});
var parameters = xml + "%%%" + orJoin + "%%%" + tokensDist;
// CALL external Service
var xhttp = new XMLHttpRequest();
var result;
var tokCount = element.tokenCount[processInstanceId];
function ciao() {
if (this.readyState == 4 && this.status == 200) {
result = this.responseText;
if (result === "true" && tokCount === 1) {// ISACTIVE
// remove token to each incoming sequence flow
incomingSequenceFlows.forEach(function(incoming) {
tokenDistribution.set(incoming, 0);
});
self._eventBus.fire(GENERATE_TOKEN_EVENT, context);
element.tokenCount[processInstanceId] = 0;
}
if(result === "false"){element.tokenCount[processInstanceId]--;}
} else {
alert("Web Service Error: " + this.statusText);
}
}
xhttp.onload = ciao;
xhttp.open("POST",
"http://localhost:8080/TokenSimulator/rest/BPMN/OrJoin", true);
xhttp.send(parameters);
} else {
// remove token to each incoming sequence flow
incomingSequenceFlows.forEach(function(incoming) {
if (!tokenDistribution.get(incoming)) {
tokenDistribution.set(incoming, 0);
} else {
var count = tokenDistribution.get(incoming) - 1;
tokenDistribution.set(incoming, count);
}
});
element.tokenCount[processInstanceId] = 0;
this._eventBus.fire(GENERATE_TOKEN_EVENT, context);
}
};
InclusiveGatewayHandler.prototype.generate = function(context) {
var self = this;
var element = context.element, processInstanceId = context.processInstanceId;
var tokenDistribution = window.tokenDistribution.get(processInstanceId);
var outgoingSequenceFlows = element.outgoing.filter(function(outgoing) {
return is(outgoing, 'bpmn:SequenceFlow');
});
var outgoingSequenceFlows = element.outgoing.filter(function(outgoing) {
return is(outgoing, 'bpmn:SequenceFlow');
});
if (Object.keys(outgoingSequenceFlows).length === 1) {
outgoingSequenceFlows.forEach(function(outgoing) {
if (!tokenDistribution.get(outgoing)) {
tokenDistribution.set(outgoing, 1);
} else {
var count = tokenDistribution.get(outgoing);
tokenDistribution.set(outgoing, count++);
}
self._animation.createAnimation(outgoing, processInstanceId,
function() {
self._eventBus.fire(CONSUME_TOKEN_EVENT, {
element : outgoing.target,
processInstanceId : processInstanceId
});
});
});
} else {
outgoingSequenceFlows.forEach(function(outgoing) {
if ((outgoing.businessObject.conditionExpression && window
.eval(outgoing.businessObject.conditionExpression.body))) {
if (!tokenDistribution.get(outgoing)) {
tokenDistribution.set(outgoing, 1);
} else {
var count = tokenDistribution.get(outgoing);
tokenDistribution.set(outgoing, count++);
}
self._animation.createAnimation(outgoing, processInstanceId,
function() {
self._eventBus.fire(CONSUME_TOKEN_EVENT, {
element : outgoing.target,
processInstanceId : processInstanceId
});
});
}
});
}
};
InclusiveGatewayHandler.$inject = [ 'animation', 'eventBus' ];
module.exports = InclusiveGatewayHandler;