mida
Version:
Muiltiple Instance and Data Animator for BPMN models.
98 lines (82 loc) • 3.16 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 ParallelGatewayHandler(animation, eventBus) {
this._animation = animation;
this._eventBus = eventBus;
};
ParallelGatewayHandler.prototype.consume = function(context) {
var element = context.element, processInstanceId = context.processInstanceId;
var tokenDistribution = window.tokenDistribution.get(processInstanceId);
if (!element.tokenCount) {
element.tokenCount = {};
}
if (!element.tokenCount[processInstanceId]) {
element.tokenCount[processInstanceId] = 0;
}
element.tokenCount[processInstanceId]++;
var incomingSequenceFlows = element.incoming.filter(function(incoming) {
return is(incoming, 'bpmn:SequenceFlow');
});
var haveTokens = true;
incomingSequenceFlows.forEach(function(income) {
if(!tokenDistribution.get(income)){
tokenDistribution.set(income, 0);
}
if (tokenDistribution.get(income) < 1) {
haveTokens = false;
}
});
if (haveTokens) {
// remove token to each incoming sequence flow
var incomingSequenceFlows = element.incoming.filter(function(incoming) {
return is(incoming, 'bpmn:SequenceFlow');
});
incomingSequenceFlows.forEach(function(incoming) {
if (!tokenDistribution.get(incoming)) {
tokenDistribution.set(incoming, 0);
} else {
var count = tokenDistribution.get(incoming)-1;
tokenDistribution.set(incoming, count);
}
});
//this._eventBus.fire(GENERATE_TOKEN_EVENT, context);
this.generate(context);
element.tokenCount[processInstanceId] = element.tokenCount[processInstanceId] - incomingSequenceFlows.length;
}
};
ParallelGatewayHandler.prototype.generate = function(context) {
var self = this;
var element = context.element, processInstanceId = context.processInstanceId;
var tokenDistribution = window.tokenDistribution.get(processInstanceId);
// add token to each outgoing sequence flow
var outgoingSequenceFlows = element.outgoing.filter(function(outgoing) {
return is(outgoing, 'bpmn:SequenceFlow');
});
outgoingSequenceFlows.forEach(function(outgoing) {
if (!tokenDistribution.get(outgoing)) {
tokenDistribution.set(outgoing, 1);
} else {
var count = tokenDistribution.get(outgoing);
tokenDistribution.set(outgoing, count++);
}
});
var outgoingSequenceFlows = element.outgoing.filter(function(outgoing) {
return is(outgoing, 'bpmn:SequenceFlow');
});
outgoingSequenceFlows.forEach(function(outgoing) {
var delay = Math.floor(Math.random() * 100);
setTimeout(function(){
self._animation.createAnimation(outgoing, processInstanceId,
function() {
self._eventBus.fire(CONSUME_TOKEN_EVENT, {
element : outgoing.target,
processInstanceId : processInstanceId
});
});
}, delay);
});
};
ParallelGatewayHandler.$inject = [ 'animation', 'eventBus' ];
module.exports = ParallelGatewayHandler;