Package org.activiti.designer.util

Source Code of org.activiti.designer.util.CloneUtil

/**
*
*/
package org.activiti.designer.util;

import java.util.ArrayList;
import java.util.List;

import org.activiti.bpmn.model.ActivitiListener;
import org.activiti.bpmn.model.Activity;
import org.activiti.bpmn.model.ComplexDataType;
import org.activiti.bpmn.model.CustomProperty;
import org.activiti.bpmn.model.DataGrid;
import org.activiti.bpmn.model.DataGridField;
import org.activiti.bpmn.model.DataGridRow;
import org.activiti.bpmn.model.EndEvent;
import org.activiti.bpmn.model.ExclusiveGateway;
import org.activiti.bpmn.model.FieldExtension;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.FormProperty;
import org.activiti.bpmn.model.FormValue;
import org.activiti.bpmn.model.InclusiveGateway;
import org.activiti.bpmn.model.ManualTask;
import org.activiti.bpmn.model.ParallelGateway;
import org.activiti.bpmn.model.ScriptTask;
import org.activiti.bpmn.model.ServiceTask;
import org.activiti.bpmn.model.StartEvent;
import org.activiti.bpmn.model.UserTask;
import org.activiti.designer.features.CreateEndEventFeature;
import org.activiti.designer.features.CreateExclusiveGatewayFeature;
import org.activiti.designer.features.CreateInclusiveGatewayFeature;
import org.activiti.designer.features.CreateMailTaskFeature;
import org.activiti.designer.features.CreateParallelGatewayFeature;
import org.activiti.designer.features.CreateScriptTaskFeature;
import org.activiti.designer.features.CreateServiceTaskFeature;
import org.activiti.designer.features.CreateStartEventFeature;
import org.activiti.designer.features.CreateUserTaskFeature;
import org.activiti.designer.util.eclipse.ActivitiUiUtil;
import org.activiti.designer.util.editor.ModelHandler;
import org.activiti.designer.util.extension.ExtensionUtil;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.graphiti.mm.pictograms.Diagram;

/**
*
* TODO: copy standard lists such as properties and node-specific list contents
* by inspecting original.get...
*
* @author Tiese Barrell
* @since 0.6.1
* @version 1
*
*/
public final class CloneUtil {

  private CloneUtil() {

  }

  public static FlowElement clone(final FlowElement element, final Diagram diagram) {

    FlowElement cloneElement = null;
    List<FormProperty> formProperties = null;

    if (element instanceof StartEvent) {
      cloneElement = clone((StartEvent) element, diagram);
      formProperties = ((StartEvent) element).getFormProperties();
    } else if (element instanceof ServiceTask) {
      cloneElement = clone((ServiceTask) element, diagram);
    } else if (element instanceof EndEvent) {
      cloneElement = clone((EndEvent) element, diagram);
    } else if (element instanceof ExclusiveGateway) {
      cloneElement = clone((ExclusiveGateway) element, diagram);
    } else if (element instanceof InclusiveGateway) {
      cloneElement = clone((InclusiveGateway) element, diagram);
    } else if (element instanceof ManualTask) {
      cloneElement = clone((ManualTask) element, diagram);
    } else if (element instanceof ParallelGateway) {
      cloneElement = clone((ParallelGateway) element, diagram);
    } else if (element instanceof ScriptTask) {
      cloneElement = clone((ScriptTask) element, diagram);
    } else if (element instanceof UserTask) {
      cloneElement = clone((UserTask) element, diagram);
      formProperties = ((UserTask) element).getFormProperties();

      List<ActivitiListener> resultListenerList = new ArrayList<ActivitiListener>();
      for (ActivitiListener listener : ((UserTask) element).getTaskListeners()) {
        resultListenerList.add(clone(listener));
      }
      ((UserTask) cloneElement).setTaskListeners(resultListenerList);
    }

    if (element instanceof Activity && element instanceof UserTask == false) {
      List<ActivitiListener> resultListenerList = new ArrayList<ActivitiListener>();
      for (ActivitiListener listener : ((Activity) element).getExecutionListeners()) {
        resultListenerList.add(clone(listener));
      }
      ((Activity) cloneElement).setExecutionListeners(resultListenerList);
    }

    if (element instanceof Activity) {
      ((Activity) cloneElement).setAsynchronous(((Activity) element).isAsynchronous());
      ((Activity) cloneElement).setDefaultFlow(((Activity) element).getDefaultFlow());
    }

    if (formProperties != null) {
      List<FormProperty> resultPropertyList = new ArrayList<FormProperty>();
      for (FormProperty formProperty : formProperties) {
        resultPropertyList.add(clone(formProperty));
      }
      if (cloneElement instanceof UserTask) {
        ((UserTask) cloneElement).setFormProperties(resultPropertyList);
      } else {
        ((StartEvent) cloneElement).setFormProperties(resultPropertyList);
      }
    }

    if (cloneElement != null) {
      cloneElement.setName(element.getName());
      ModelHandler.getModel(EcoreUtil.getURI(diagram)).getBpmnModel().getMainProcess().addFlowElement(cloneElement);
    }

    return cloneElement;

  }

  private static ActivitiListener clone(final ActivitiListener listener) {
    ActivitiListener result = new ActivitiListener();
    result.setId(listener.getId());
    result.setEvent(listener.getEvent());
    result.setImplementation(listener.getImplementation());
    result.setImplementationType(listener.getImplementationType());
    for (FieldExtension extension : listener.getFieldExtensions()) {
      result.getFieldExtensions().add(clone(extension));
    }
    return result;
  }

  private static FormProperty clone(final FormProperty formProperty) {
    FormProperty result = new FormProperty();
    result.setId(formProperty.getId());
    result.setName(formProperty.getName());
    result.setType(formProperty.getType());
    result.setExpression(formProperty.getExpression());
    result.setVariable(formProperty.getVariable());
    result.setDefaultExpression(formProperty.getDefaultExpression());
    result.setDatePattern(formProperty.getDatePattern());
    result.setReadable(formProperty.isReadable());
    result.setRequired(formProperty.isRequired());
    result.setWriteable(formProperty.isWriteable());

    List<FormValue> resultValueList = new ArrayList<FormValue>();
    for (FormValue formValue : formProperty.getFormValues()) {
      FormValue resultValue = new FormValue();
      resultValue.setId(formValue.getId());
      resultValue.setName(formValue.getName());
      resultValueList.add(resultValue);
    }
    result.setFormValues(resultValueList);

    return result;
  }

  /**
   * Clones a {@link StartEvent}.
   *
   * @param original
   *          the object to clone
   * @return a clone of the original object
   */
  private static final StartEvent clone(final StartEvent original, final Diagram diagram) {
    StartEvent result = new StartEvent();
    result.setId(ActivitiUiUtil.getNextId(result.getClass(), CreateStartEventFeature.FEATURE_ID_KEY, diagram));
    return result;
  }

  /**
   * Clones an {@link EndEvent}.
   *
   * @param original
   *          the object to clone
   * @return a clone of the original object
   */
  private static final EndEvent clone(final EndEvent original, final Diagram diagram) {
    EndEvent result = new EndEvent();
    result.setId(ActivitiUiUtil.getNextId(result.getClass(), CreateEndEventFeature.FEATURE_ID_KEY, diagram));
    return result;

  }

  /**
   * Clones an {@link ExclusiveGateway}.
   *
   * @param original
   *          the object to clone
   * @return a clone of the original object
   */
  private static final ExclusiveGateway clone(final ExclusiveGateway original, final Diagram diagram) {
    ExclusiveGateway result = new ExclusiveGateway();
    result.setId(ActivitiUiUtil.getNextId(result.getClass(), CreateExclusiveGatewayFeature.FEATURE_ID_KEY, diagram));
    return result;

  }

  /**
   * Clones an {@link InclusiveGateway}.
   *
   * @param original
   *          the object to clone
   * @return a clone of the original object
   */
  private static final InclusiveGateway clone(final InclusiveGateway original, final Diagram diagram) {
    InclusiveGateway result = new InclusiveGateway();
    result.setId(ActivitiUiUtil.getNextId(result.getClass(), CreateInclusiveGatewayFeature.FEATURE_ID_KEY, diagram));
    return result;
  }

  /**
   * Clones a {@link ManualTask}.
   *
   * @param original
   *          the object to clone
   * @return a clone of the original object
   */
  private static final ManualTask clone(final ManualTask original, final Diagram diagram) {
    ManualTask result = new ManualTask();
    result.setId(ActivitiUiUtil.getNextId(result.getClass(), CreateMailTaskFeature.FEATURE_ID_KEY, diagram));
    return result;
  }

  /**
   * Clones a {@link ParallelGateway}.
   *
   * @param original
   *          the object to clone
   * @return a clone of the original object
   */
  private static final ParallelGateway clone(final ParallelGateway original, final Diagram diagram) {
    ParallelGateway result = new ParallelGateway();
    result.setId(ActivitiUiUtil.getNextId(result.getClass(), CreateParallelGatewayFeature.FEATURE_ID_KEY, diagram));
    return result;
  }

  /**
   * Clones a {@link ScriptTask}.
   *
   * @param original
   *          the object to clone
   * @return a clone of the original object
   */
  private static final ScriptTask clone(final ScriptTask original, final Diagram diagram) {
    ScriptTask result = new ScriptTask();

    result.setId(ActivitiUiUtil.getNextId(result.getClass(), CreateScriptTaskFeature.FEATURE_ID_KEY, diagram));
    result.setScript(original.getScript());
    result.setScriptFormat(original.getScriptFormat());

    return result;

  }

  /**
   * Clones a {@link UserTask}.
   *
   * @param original
   *          the object to clone
   * @return a clone of the original object
   */
  private static final UserTask clone(final UserTask original, final Diagram diagram) {
    UserTask result = new UserTask();

    result.setId(ActivitiUiUtil.getNextId(result.getClass(), CreateUserTaskFeature.FEATURE_ID_KEY, diagram));
    result.setAssignee(original.getAssignee());
    result.setFormKey(original.getFormKey());
    result.setDueDate(original.getDueDate());
    result.setPriority(original.getPriority());

    return result;
  }

  /**
   * Clones a {@link ServiceTask}.
   *
   * @param original
   *          the object to clone
   * @return a clone of the original object
   */
  private static final ServiceTask clone(final ServiceTask original, final Diagram diagram) {

    ServiceTask result = new ServiceTask();

    result.setId(ActivitiUiUtil.getNextId(result.getClass(), CreateServiceTaskFeature.FEATURE_ID_KEY, diagram));
    result.setImplementation(original.getImplementation());
    result.setExtensionId(original.getExtensionId());

    for (FieldExtension extension : original.getFieldExtensions()) {
      result.getFieldExtensions().add(clone(extension));
    }
   
    for (CustomProperty property : original.getCustomProperties()) {
      final CustomProperty clone = clone(property);
      // Reset the id
      clone.setId(ExtensionUtil.wrapCustomPropertyId(result, ExtensionUtil.upWrapCustomPropertyId(clone.getId())));
      result.getCustomProperties().add(clone);
    }

    return result;
  }

  /**
   * Clones a {@link CustomProperty}.
   *
   * @param original
   *          the object to clone
   * @return a clone of the original object
   */
  private static final CustomProperty clone(final CustomProperty original) {
    CustomProperty result = new CustomProperty();
    result.setId(original.getId());
    if (original.getComplexValue() != null) {
      result.setComplexValue(clone(original.getComplexValue()));
    }
    result.setName(original.getName());
    result.setSimpleValue(original.getSimpleValue());
    return result;
  }
 
  private static final FieldExtension clone(final FieldExtension original) {
    FieldExtension result = new FieldExtension();
    result.setFieldName(original.getFieldName());
    result.setExpression(original.getExpression());
    result.setStringValue(original.getStringValue());
    return result;
  }

  private static ComplexDataType clone(ComplexDataType complexValue) {
    if (complexValue instanceof DataGrid) {
      final DataGrid dataGrid = (DataGrid) complexValue;
      DataGrid result = new DataGrid();
      for (final DataGridRow dataGridRow : dataGrid.getRows()) {
        final DataGridRow rowClone = new DataGridRow();
        rowClone.setIndex(dataGridRow.getIndex());
        for (final DataGridField dataGridField : dataGridRow.getFields()) {
          final DataGridField fieldClone = new DataGridField();
          fieldClone.setName(dataGridField.getName());
          fieldClone.setValue(dataGridField.getValue());
          rowClone.getFields().add(fieldClone);
        }
        result.getRows().add(rowClone);
      }
      return result;
    }
    return null;
  }

}
TOP

Related Classes of org.activiti.designer.util.CloneUtil

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.