All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.effektif.workflow.api.activities.SubProcess Maven / Gradle / Ivy

There is a newer version: 3.0.0-beta14
Show newest version
/*
 * Copyright 2014 Effektif GmbH.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.effektif.workflow.api.activities;

import com.effektif.workflow.api.bpmn.BpmnElement;
import com.effektif.workflow.api.bpmn.BpmnReader;
import com.effektif.workflow.api.bpmn.BpmnWriter;
import com.effektif.workflow.api.bpmn.XmlElement;
import com.effektif.workflow.api.json.TypeName;
import com.effektif.workflow.api.model.WorkflowId;
import com.effektif.workflow.api.types.DataType;
import com.effektif.workflow.api.workflow.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/** 
 * Invokes another workflow and ends when the other workflow instance completes.
 *
 * @see Call Activity
 * @author Tom Baeyens
 */ 
@TypeName("subProcess")
@BpmnElement("callActivity")
public class SubProcess extends AbstractBindableActivity {

  protected WorkflowId subWorkflowId; 
  protected Binding subWorkflowSourceId;

  /**
   * Maps sub-workflow variable IDs to parent workflow bindings, e.g. variable expressions.
   */
  protected Map subWorkflowInputs;

  @Override
  public void readBpmn(BpmnReader r) {
    subWorkflowId = r.readIdAttributeEffektif("subWorkflowId", WorkflowId.class);
    subWorkflowSourceId(r.readStringAttributeEffektif("subWorkflowSourceId"));
    super.readBpmn(r);

    r.startExtensionElements();

    // Read sub-workflow inputs.
    for (XmlElement inputElement : r.readElementsEffektif("subWorkflowInput")) {
      if (subWorkflowInputs == null) {
        subWorkflowInputs = new HashMap<>();
      }
      r.startElement(inputElement);
      String variableId = r.readStringAttributeEffektif("variableId");
      List> singleBinding = r.readBindings("binding");
      if (singleBinding != null && !singleBinding.isEmpty()) {
        subWorkflowInputs.put(variableId, singleBinding.get(0));
      }
      r.endElement();
    }

    r.endExtensionElements();
  }

  @Override
  public void writeBpmn(BpmnWriter w) {
    super.writeBpmn(w);
    w.writeIdAttributeEffektif("subWorkflowId", subWorkflowId);
    if (subWorkflowSourceId != null) {
      w.writeStringAttributeEffektif("subWorkflowSourceId", subWorkflowSourceId.getValue());
    }
    if (subWorkflowInputs != null) {
      w.startExtensionElements();
      for (Map.Entry input : subWorkflowInputs.entrySet()) {
        if (input.getKey() != null && input.getValue() != null) {
          w.startElementEffektif("subWorkflowInput");
          w.writeStringAttributeEffektif("variableId", input.getKey());
          w.writeBinding("binding", input.getValue());
          w.endElement();
        }
      }
      w.endExtensionElements();
    }
  }

  @Override
  public SubProcess id(String id) {
    super.id(id);
    return this;
  }

  public SubProcess subWorkflowId(WorkflowId subWorkflowId) {
    this.subWorkflowId = subWorkflowId;
    return this;
  }

  public SubProcess subWorkflowSourceId(String id) {
    setSubWorkflowSourceId(id);
    return this;
  }
  
  public WorkflowId getSubWorkflowId() {
    return subWorkflowId;
  }
  
  public String getSubWorkflowSourceId() {
    return subWorkflowSourceId == null ? null : subWorkflowSourceId.getValue();
  }

  public void setSubWorkflowId(WorkflowId id) {
    this.subWorkflowId = id;
  }
  
  public void setSubWorkflowSourceId(String id) {
    this.subWorkflowSourceId = new Binding().value(id);
  }

  public Map getSubWorkflowInputs() {
    return subWorkflowInputs;
  }

  public void setSubWorkflowInputs(Map subWorkflowInputs) {
    this.subWorkflowInputs = subWorkflowInputs;
  }

  @Override
  public SubProcess inputExpression(String subWorkflowVariableId, String expression) {
    if (subWorkflowInputs == null) {
      subWorkflowInputs = new HashMap<>();
    }
    subWorkflowInputs.put(subWorkflowVariableId, new Binding().expression(expression));
    return this;
  }

  @Override
  public SubProcess inputValue(String subWorkflowVariableId, Object value) {
    if (subWorkflowInputs == null) {
      subWorkflowInputs = new HashMap<>();
    }
    subWorkflowInputs.put(subWorkflowVariableId, new Binding().value(value));
    return this;
  }

  @Override
  public SubProcess output(String subWorkflowKey, String variableId) {
    super.output(subWorkflowKey, variableId);
    return this;
  }

  /**
   * @see Multi-instance tasks
   */
  @Override
  public SubProcess multiInstance(MultiInstance multiInstance) {
    super.multiInstance(multiInstance);
    return this;
  }

  @Override
  public SubProcess transitionTo(String toActivityId) {
    super.transitionTo(toActivityId);
    return this;
  }

  @Override
  public SubProcess transitionTo(Transition transition) {
    super.transitionTo(transition);
    return this;
  }

  @Override
  public SubProcess activity(Activity activity) {
    super.activity(activity);
    return this;
  }

  @Override
  public SubProcess transition(Transition transition) {
    super.transition(transition);
    return this;
  }

  @Override
  public SubProcess variable(Variable variable) {
    super.variable(variable);
    return this;
  }

  @Override
  public SubProcess timer(Timer timer) {
    super.timer(timer);
    return this;
  }

  @Override
  public SubProcess property(String key, Object value) {
    super.property(key, value);
    return this;
  }
  @Override
  public SubProcess transitionToNext() {
    super.transitionToNext();
    return this;
  }
  @Override
  public SubProcess activity(String id, Activity activity) {
    super.activity(id, activity);
    return this;
  }
  @Override
  public SubProcess transition(String id, Transition transition) {
    super.transition(id, transition);
    return this;
  }
  @Override
  public SubProcess variable(String id, DataType type) {
    super.variable(id, type);
    return this;
  }
  @Override
  public SubProcess name(String name) {
    super.name(name);
    return this;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy