mida
Version:
Muiltiple Instance and Data Animator for BPMN models.
137 lines (122 loc) • 4.4 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, UPDATE_ELEMENT_EVENT = events.UPDATE_ELEMENT_EVENT;
var tokens = require('../TokenSimulationBehavior');
function SubProcessHandler(animation, eventBus, log) {
this._animation = animation;
this._eventBus = eventBus;
this._log = log;
this.maxI = 1;
};
SubProcessHandler.prototype.consume = function(context) {
var element = context.element, processInstanceId = context.processInstanceId;
//MI ACTIVITY
var isSequential;
if (element.businessObject.loopCharacteristics) {
//
isSequential = element.businessObject.loopCharacteristics
.get('isSequential');
if (element.businessObject.loopCharacteristics.get('loopCardinality')) {
this.maxI = parseInt(element.businessObject.loopCharacteristics.get(
'loopCardinality').get('body'));
}
}
for(var i =0; i<this.maxI; i++){
var startEvents = element.children.filter(function(child) {
return is(child, 'bpmn:StartEvent')
&& !child.businessObject.eventDefinitions;
});
// if (!startEvents) {
// this._log.log('Skipping Subprocess', 'info', 'fa-angle-double-right');
//
// // skip subprocess
// this._eventBus.fire(GENERATE_TOKEN_EVENT, context);
// } else {
this._log.log('Starting Subprocess', 'info', 'fa-sign-in');
var self = this;
var tokenDistribution = window.tokenDistribution.get(processInstanceId);
startEvents.forEach(function(startEvent) {
// start subprocess with process instance ID as parent process instance
// ID
self._eventBus.fire(GENERATE_TOKEN_EVENT, {
element : startEvent,
parentProcessInstanceId : processInstanceId
});
});
// }
this._eventBus.fire(UPDATE_ELEMENT_EVENT, {
element : element
});
}
};
SubProcessHandler.prototype.generate = function(context) {
var self = this;
var element = context.element, processInstanceId = context.processInstanceId;
var tokenDistribution = window.tokenDistribution;
var sFlows = element.children.filter(function(sFlow) {
return is(sFlow, 'bpmn:SequenceFlow');
});
var isActive = true;
sFlows.forEach(function(sFlow) {
if (tokenDistribution.get(sFlow) > 0) {
isActive = false;
}
});
this.maxI--;
var miGuard = true;
if(this.maxI > 0){
miGuard = false;
}
if (isActive && miGuard) {
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');
});
incomingSequenceFlows.forEach(function(incoming) {
var tokDist = window.tokenDistribution.get(processInstanceId);
if (!tokenDistribution.get(incoming)) {
tokenDistribution.set(incoming, 1);
} else {
var count = tokenDistribution.get(incoming);
tokenDistribution.set(incoming, count++);
}
});
// 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);
}
});
// 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++);
}
self._animation.createAnimation(outgoing, processInstanceId,
function() {
self._eventBus.fire(CONSUME_TOKEN_EVENT, {
element : outgoing.target,
processInstanceId : processInstanceId
});
});
});
this._eventBus.fire(UPDATE_ELEMENT_EVENT, {
element : element
});
}
};
SubProcessHandler.$inject = [ 'animation', 'eventBus', 'log' ];
module.exports = SubProcessHandler;