3 var ModelUtil = require('bpmn-js/lib/util/ModelUtil'),
 
   5     getBusinessObject = ModelUtil.getBusinessObject;
 
   7 var extensionElementsHelper = require('bpmn-js-properties-panel/lib/helper/ExtensionElementsHelper'),
 
   8     implementationTypeHelper = require('bpmn-js-properties-panel/lib/helper/ImplementationTypeHelper');
 
  10 var InputOutputHelper = {};
 
  12 module.exports = InputOutputHelper;
 
  14 function getElements(bo, type, prop) {
 
  15     var elems = extensionElementsHelper.getExtensionElements(bo, type) || [];
 
  16     return !prop ? elems : (elems[0] || {})[prop] || [];
 
  19 function getParameters(element, prop, insideConnector) {
 
  20     var inputOutput = InputOutputHelper.getInputOutput(
 
  24     return (inputOutput && inputOutput.get(prop)) || [];
 
  28  * Get a inputOutput from the business object
 
  30  * @param {djs.model.Base} element
 
  31  * @param  {boolean} insideConnector
 
  33  * @return {ModdleElement} the inputOutput object
 
  35 InputOutputHelper.getInputOutput = function(element, insideConnector) {
 
  36     if (!insideConnector) {
 
  37         var bo = getBusinessObject(element);
 
  38         return (getElements(bo, 'camunda:InputOutput') || [])[0];
 
  40     var connector = this.getConnector(element);
 
  42     return connector && connector.get('inputOutput');
 
  46  * Get a connector from the business object
 
  48  * @param {djs.model.Base} element
 
  50  * @return {ModdleElement} the connector object
 
  52 InputOutputHelper.getConnector = function(element) {
 
  53     var bo = implementationTypeHelper.getServiceTaskLikeBusinessObject(element);
 
  54     return bo && (getElements(bo, 'camunda:Connector') || [])[0];
 
  58  * Return all input parameters existing in the business object, and
 
  59  * an empty array if none exist.
 
  61  * @param  {djs.model.Base} element
 
  62  * @param  {boolean} insideConnector
 
  64  * @return {Array} a list of input parameter objects
 
  66 InputOutputHelper.getInputParameters = function(element, insideConnector) {
 
  67     return getParameters.apply(this, [
 
  75  * Return all output parameters existing in the business object, and
 
  76  * an empty array if none exist.
 
  78  * @param  {djs.model.Base} element
 
  79  * @param  {boolean} insideConnector
 
  81  * @return {Array} a list of output parameter objects
 
  83 InputOutputHelper.getOutputParameters = function(element, insideConnector) {
 
  84     return getParameters.apply(this, [
 
  92  * Get a input parameter from the business object at given index
 
  94  * @param {djs.model.Base} element
 
  95  * @param  {boolean} insideConnector
 
  98  * @return {ModdleElement} input parameter
 
 100 InputOutputHelper.getInputParameter = function(element, insideConnector, idx) {
 
 101     return this.getInputParameters(element, insideConnector)[idx];
 
 105  * Get a output parameter from the business object at given index
 
 107  * @param {djs.model.Base} element
 
 108  * @param  {boolean} insideConnector
 
 109  * @param {number} idx
 
 111  * @return {ModdleElement} output parameter
 
 113 InputOutputHelper.getOutputParameter = function(element, insideConnector, idx) {
 
 114     return this.getOutputParameters(element, insideConnector)[idx];
 
 118  * Returns 'true' if the given element supports inputOutput
 
 120  * @param {djs.model.Base} element
 
 121  * @param  {boolean} insideConnector
 
 123  * @return {boolean} a boolean value
 
 125 InputOutputHelper.isInputOutputSupported = function(element, insideConnector) {
 
 126     var bo = getBusinessObject(element);
 
 129         is(bo, 'bpmn:Process') ||
 
 130         (is(bo, 'bpmn:FlowNode') &&
 
 131             !is(bo, 'bpmn:StartEvent') &&
 
 132             !is(bo, 'bpmn:BoundaryEvent') &&
 
 133             !(is(bo, 'bpmn:SubProcess') && bo.get('triggeredByEvent')))
 
 138  * Returns 'true' if the given element supports output parameters
 
 140  * @param {djs.model.Base} element
 
 141  * @param  {boolean} insideConnector
 
 143  * @return {boolean} a boolean value
 
 145 InputOutputHelper.areOutputParametersSupported = function(
 
 149     var bo = getBusinessObject(element);
 
 151         insideConnector || (!is(bo, 'bpmn:EndEvent') && !bo.loopCharacteristics)