/**
*
*/
package org.activiti.designer.util;
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.property.extension.util.ExtensionUtil;
import org.activiti.designer.util.eclipse.ActivitiUiUtil;
import org.eclipse.bpmn2.Bpmn2Factory;
import org.eclipse.bpmn2.ComplexDataType;
import org.eclipse.bpmn2.CustomProperty;
import org.eclipse.bpmn2.DataGrid;
import org.eclipse.bpmn2.DataGridField;
import org.eclipse.bpmn2.DataGridRow;
import org.eclipse.bpmn2.EndEvent;
import org.eclipse.bpmn2.ExclusiveGateway;
import org.eclipse.bpmn2.FlowElement;
import org.eclipse.bpmn2.InclusiveGateway;
import org.eclipse.bpmn2.MailTask;
import org.eclipse.bpmn2.ManualTask;
import org.eclipse.bpmn2.ParallelGateway;
import org.eclipse.bpmn2.ScriptTask;
import org.eclipse.bpmn2.ServiceTask;
import org.eclipse.bpmn2.StartEvent;
import org.eclipse.bpmn2.UserTask;
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) {
if (element instanceof StartEvent) {
return clone((StartEvent) element, diagram);
} else if (element instanceof ServiceTask) {
return clone((ServiceTask) element, diagram);
} else if (element instanceof EndEvent) {
return clone((EndEvent) element, diagram);
} else if (element instanceof ExclusiveGateway) {
return clone((ExclusiveGateway) element, diagram);
} else if (element instanceof InclusiveGateway) {
return clone((InclusiveGateway) element, diagram);
} else if (element instanceof MailTask) {
return clone((MailTask) element, diagram);
} else if (element instanceof ManualTask) {
return clone((ManualTask) element, diagram);
} else if (element instanceof ParallelGateway) {
return clone((ParallelGateway) element, diagram);
} else if (element instanceof ScriptTask) {
return clone((ScriptTask) element, diagram);
} else if (element instanceof UserTask) {
return clone((UserTask) element, diagram);
}
return null;
}
/**
* 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 = Bpmn2Factory.eINSTANCE.createStartEvent();
result.setId(ActivitiUiUtil.getNextId(result.getClass(), CreateStartEventFeature.FEATURE_ID_KEY, diagram));
result.setName(original.getName());
diagram.eResource().getContents().add(result);
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 = Bpmn2Factory.eINSTANCE.createEndEvent();
result.setId(ActivitiUiUtil.getNextId(result.getClass(), CreateEndEventFeature.FEATURE_ID_KEY, diagram));
result.setName(original.getName());
diagram.eResource().getContents().add(result);
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 = Bpmn2Factory.eINSTANCE.createExclusiveGateway();
result.setId(ActivitiUiUtil.getNextId(result.getClass(), CreateExclusiveGatewayFeature.FEATURE_ID_KEY, diagram));
result.setName(original.getName());
result.setGatewayDirection(original.getGatewayDirection());
diagram.eResource().getContents().add(result);
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 = Bpmn2Factory.eINSTANCE.createInclusiveGateway();
result.setId(ActivitiUiUtil.getNextId(result.getClass(), CreateInclusiveGatewayFeature.FEATURE_ID_KEY, diagram));
result.setName(original.getName());
result.setGatewayDirection(original.getGatewayDirection());
diagram.eResource().getContents().add(result);
return result;
}
/**
* Clones a {@link MailTask}.
*
* @param original
* the object to clone
* @return a clone of the original object
*/
private static final MailTask clone(final MailTask original, final Diagram diagram) {
MailTask result = Bpmn2Factory.eINSTANCE.createMailTask();
result.setId(ActivitiUiUtil.getNextId(result.getClass(), CreateMailTaskFeature.FEATURE_ID_KEY, diagram));
result.setName(original.getName());
result.setBcc(original.getBcc());
result.setCc(original.getCc());
result.setFrom(original.getFrom());
result.setHtml(original.getHtml());
result.setSubject(original.getSubject());
result.setText(original.getText());
result.setTo(original.getTo());
diagram.eResource().getContents().add(result);
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 = Bpmn2Factory.eINSTANCE.createManualTask();
result.setId(ActivitiUiUtil.getNextId(result.getClass(), CreateMailTaskFeature.FEATURE_ID_KEY, diagram));
result.setName(original.getName());
diagram.eResource().getContents().add(result);
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 = Bpmn2Factory.eINSTANCE.createParallelGateway();
result.setId(ActivitiUiUtil.getNextId(result.getClass(), CreateParallelGatewayFeature.FEATURE_ID_KEY, diagram));
result.setName(original.getName());
result.setGatewayDirection(original.getGatewayDirection());
diagram.eResource().getContents().add(result);
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 = Bpmn2Factory.eINSTANCE.createScriptTask();
result.setId(ActivitiUiUtil.getNextId(result.getClass(), CreateScriptTaskFeature.FEATURE_ID_KEY, diagram));
result.setName(original.getName());
result.setScript(original.getScript());
result.setScriptFormat(original.getScriptFormat());
diagram.eResource().getContents().add(result);
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 = Bpmn2Factory.eINSTANCE.createUserTask();
result.setId(ActivitiUiUtil.getNextId(result.getClass(), CreateUserTaskFeature.FEATURE_ID_KEY, diagram));
result.setName(original.getName());
result.setAssignee(original.getAssignee());
result.setFormKey(original.getFormKey());
result.setImplementation(original.getImplementation());
diagram.eResource().getContents().add(result);
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 = Bpmn2Factory.eINSTANCE.createServiceTask();
result.setId(ActivitiUiUtil.getNextId(result.getClass(), CreateServiceTaskFeature.FEATURE_ID_KEY, diagram));
result.setName(original.getName());
result.setImplementation(original.getImplementation());
for (CustomProperty property : original.getCustomProperties()) {
final CustomProperty clone = clone(property, diagram);
// Reset the id
clone.setId(ExtensionUtil.wrapCustomPropertyId(result, ExtensionUtil.upWrapCustomPropertyId(clone.getId())));
diagram.eResource().getContents().add(clone);
result.getCustomProperties().add(clone);
}
diagram.eResource().getContents().add(result);
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, final Diagram diagram) {
CustomProperty result = Bpmn2Factory.eINSTANCE.createCustomProperty();
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 ComplexDataType clone(ComplexDataType complexValue) {
if (complexValue instanceof DataGrid) {
final DataGrid dataGrid = (DataGrid) complexValue;
DataGrid result = Bpmn2Factory.eINSTANCE.createDataGrid();
for (final DataGridRow dataGridRow : dataGrid.getRow()) {
final DataGridRow rowClone = Bpmn2Factory.eINSTANCE.createDataGridRow();
rowClone.setIndex(dataGridRow.getIndex());
for (final DataGridField dataGridField : dataGridRow.getField()) {
final DataGridField fieldClone = Bpmn2Factory.eINSTANCE.createDataGridField();
fieldClone.setName(dataGridField.getName());
fieldClone.setSimpleValue(dataGridField.getSimpleValue());
rowClone.getField().add(fieldClone);
}
result.getRow().add(rowClone);
}
return result;
}
return null;
}
}