package org.activiti.designer.property.ui;
import java.util.List;
import org.activiti.bpmn.model.ActivitiListener;
import org.activiti.bpmn.model.FieldExtension;
import org.activiti.bpmn.model.alfresco.AlfrescoScriptTask;
import org.activiti.bpmn.model.alfresco.AlfrescoUserTask;
import org.activiti.designer.util.BpmnBOUtil;
import org.activiti.designer.util.eclipse.ActivitiUiUtil;
import org.apache.commons.lang.StringUtils;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.graphiti.mm.pictograms.Diagram;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.eclipse.graphiti.platform.IDiagramEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableItem;
public abstract class AbstractListenerEditor extends TableFieldEditor {
protected Composite parent;
public PictogramElement pictogramElement;
public IDiagramEditor diagramEditor;
public Diagram diagram;
public boolean isSequenceFlow;
private List<ActivitiListener> listenerList;
public AbstractListenerEditor(String key, Composite parent) {
super(key, "", new String[] {"Listener implementation", "Type", "Event", "Fields"},
new int[] {200, 150, 100, 300}, parent);
this.parent = parent;
}
public void initialize(List<ActivitiListener> listenerList) {
removeTableItems();
this.listenerList = listenerList;
if(listenerList == null || listenerList.size() == 0) return;
for (ActivitiListener listener : listenerList) {
addTableItem(listener);
}
}
@Override
protected String createList(String[][] items) {
return null;
}
@Override
protected String[][] parseString(String string) {
return null;
}
protected void addTableItem(ActivitiListener listener) {
if(table != null) {
TableItem tableItem = new TableItem(table, SWT.NONE);
tableItem.setText(0, listener.getImplementation());
tableItem.setText(1, listener.getImplementationType());
String event = listener.getEvent();
if(isSequenceFlow && listener.getEvent() == null) {
event = "take";
}
tableItem.setText(2, event);
String fieldString = "";
if(listener.getFieldExtensions() != null) {
for (FieldExtension fieldExtension : listener.getFieldExtensions()) {
if(fieldString.length() > 0) {
fieldString += "� ";
}
if (StringUtils.isNotEmpty(fieldExtension.getExpression())) {
fieldString += fieldExtension.getFieldName() + ":" + fieldExtension.getExpression();
} else {
fieldString += fieldExtension.getFieldName() + ":" + fieldExtension.getStringValue();
}
}
}
tableItem.setText(3, fieldString);
}
}
@Override
protected String[] getNewInputObject() {
AbstractListenerDialog dialog = getDialog(parent.getShell(), getItems());
dialog.open();
if(StringUtils.isNotEmpty(dialog.eventName) && StringUtils.isNotEmpty(dialog.implementation)) {
saveNewObject(dialog);
return new String[] { dialog.implementation, dialog.implementationType, dialog.eventName, getFieldString(dialog.fieldExtensionList) };
} else {
return null;
}
}
@Override
protected String[] getChangedInputObject(TableItem item) {
int index = table.getSelectionIndex();
AbstractListenerDialog dialog = getDialog(parent.getShell(), getItems(),
listenerList.get(table.getSelectionIndex()));
dialog.open();
if(StringUtils.isNotEmpty(dialog.eventName) && StringUtils.isNotEmpty(dialog.implementation)) {
saveChangedObject(dialog, index);
return new String[] { dialog.implementation, dialog.implementationType, dialog.eventName, getFieldString(dialog.fieldExtensionList) };
} else {
return null;
}
}
@Override
protected void removedItem(int index) {
if(index >= 0 && index < listenerList.size()) {
saveRemovedObject(listenerList.get(index));
}
}
protected abstract AbstractListenerDialog getDialog(Shell shell, TableItem[] items);
protected abstract AbstractListenerDialog getDialog(Shell shell, TableItem[] items,
ActivitiListener listener);
private String getFieldString(List<FieldExtension> fieldList) {
String fieldString = "";
if(fieldList != null) {
for (FieldExtension fieldExtension : fieldList) {
if(fieldString.length() > 0) {
fieldString += ", ";
}
if (StringUtils.isNotEmpty(fieldExtension.getExpression())) {
fieldString += fieldExtension.getFieldName() + ":" + fieldExtension.getExpression();
} else {
fieldString += fieldExtension.getFieldName() + ":" + fieldExtension.getStringValue();
}
}
}
return fieldString;
}
private void saveNewObject(final AbstractListenerDialog dialog) {
if (pictogramElement != null) {
final Object bo = BpmnBOUtil.getExecutionListenerBO(pictogramElement, diagram);
if (bo == null) {
return;
}
TransactionalEditingDomain editingDomain = diagramEditor.getEditingDomain();
ActivitiUiUtil.runModelChange(new Runnable() {
public void run() {
ActivitiListener newListener = new ActivitiListener();
newListener.setEvent(dialog.eventName);
newListener.setImplementationType(dialog.implementationType);
newListener.setImplementation(dialog.implementation);
if(AlfrescoUserTask.ALFRESCO_SCRIPT_TASK_LISTENER.equalsIgnoreCase(dialog.implementation) ||
AlfrescoScriptTask.ALFRESCO_SCRIPT_EXECUTION_LISTENER.equalsIgnoreCase(dialog.implementation)) {
FieldExtension scriptExtension = new FieldExtension();
scriptExtension.setFieldName("script");
scriptExtension.setStringValue(dialog.script);
newListener.getFieldExtensions().add(scriptExtension);
FieldExtension runAsExtension = new FieldExtension();
runAsExtension.setFieldName("runAs");
runAsExtension.setStringValue(dialog.runAs);
newListener.getFieldExtensions().add(runAsExtension);
FieldExtension scriptProcessorExtension = new FieldExtension();
scriptProcessorExtension.setFieldName("scriptProcessor");
scriptProcessorExtension.setStringValue(dialog.scriptProcessor);
newListener.getFieldExtensions().add(scriptProcessorExtension);
} else {
setFieldsInListener(newListener, dialog.fieldExtensionList);
}
BpmnBOUtil.addListener(bo, newListener, diagram);
}
}, editingDomain, "Model Update");
}
}
private void saveChangedObject(final AbstractListenerDialog dialog, final int index) {
if (pictogramElement != null) {
final Object bo = BpmnBOUtil.getExecutionListenerBO(pictogramElement, diagram);
if (bo == null) {
return;
}
TransactionalEditingDomain editingDomain = diagramEditor.getEditingDomain();
ActivitiUiUtil.runModelChange(new Runnable() {
public void run() {
ActivitiListener listener = listenerList.get(index);
if(listener != null) {
listener.setEvent(dialog.eventName);
listener.setImplementation(dialog.implementation);
listener.setImplementationType(dialog.implementationType);
if(AlfrescoUserTask.ALFRESCO_SCRIPT_TASK_LISTENER.equalsIgnoreCase(dialog.implementation) ||
AlfrescoScriptTask.ALFRESCO_SCRIPT_EXECUTION_LISTENER.equalsIgnoreCase(dialog.implementation)) {
List<FieldExtension> extensionList = listener.getFieldExtensions();
FieldExtension scriptExtension = null;
FieldExtension runAsExtension = null;
FieldExtension scriptProcessorExtension = null;
for (FieldExtension fieldExtension : extensionList) {
if ("script".equalsIgnoreCase(fieldExtension.getFieldName())) {
scriptExtension = fieldExtension;
} else if ("runAs".equalsIgnoreCase(fieldExtension.getFieldName())) {
runAsExtension = fieldExtension;
} else if ("scriptProcessor".equalsIgnoreCase(fieldExtension.getFieldName())) {
scriptProcessorExtension = fieldExtension;
}
}
if (scriptExtension != null) {
scriptExtension.setStringValue(dialog.script);
} else {
scriptExtension = new FieldExtension();
scriptExtension.setFieldName("script");
scriptExtension.setStringValue(dialog.script);
listener.getFieldExtensions().add(scriptExtension);
}
if (runAsExtension != null) {
runAsExtension.setStringValue(dialog.runAs);
} else {
runAsExtension = new FieldExtension();
runAsExtension.setFieldName("runAs");
runAsExtension.setStringValue(dialog.runAs);
listener.getFieldExtensions().add(runAsExtension);
}
if (scriptProcessorExtension != null) {
scriptProcessorExtension.setStringValue(dialog.scriptProcessor);
} else {
scriptProcessorExtension = new FieldExtension();
scriptProcessorExtension.setFieldName("scriptProcessor");
scriptProcessorExtension.setStringValue(dialog.scriptProcessor);
listener.getFieldExtensions().add(scriptProcessorExtension);
}
} else {
setFieldsInListener(listener, dialog.fieldExtensionList);
}
BpmnBOUtil.setListener(bo, listener, index, diagram);
}
}
}, editingDomain, "Model Update");
}
}
private void saveRemovedObject(final ActivitiListener listener) {
if (pictogramElement != null) {
final Object bo = BpmnBOUtil.getExecutionListenerBO(pictogramElement, diagram);
if (bo == null) {
return;
}
TransactionalEditingDomain editingDomain = diagramEditor.getEditingDomain();
ActivitiUiUtil.runModelChange(new Runnable() {
public void run() {
BpmnBOUtil.removeListener(bo, listener, diagram);
}
}, editingDomain, "Model Update");
}
}
@Override
protected void upPressed() {
final int index = table.getSelectionIndex();
final Object bo = BpmnBOUtil.getExecutionListenerBO(pictogramElement, diagram);
if (bo != null) {
TransactionalEditingDomain editingDomain = diagramEditor.getEditingDomain();
ActivitiUiUtil.runModelChange(new Runnable() {
public void run() {
ActivitiListener listener = listenerList.remove(index);
listenerList.add(index - 1, listener);
}
}, editingDomain, "Model Update");
}
super.upPressed();
}
@Override
protected void downPressed() {
final int index = table.getSelectionIndex();
final Object bo = BpmnBOUtil.getExecutionListenerBO(pictogramElement, diagram);
if (bo != null) {
TransactionalEditingDomain editingDomain = diagramEditor.getEditingDomain();
ActivitiUiUtil.runModelChange(new Runnable() {
public void run() {
ActivitiListener listener = listenerList.remove(index);
listenerList.add(index + 1, listener);
}
}, editingDomain, "Model Update");
}
super.downPressed();
}
private void setFieldsInListener(ActivitiListener listener, List<FieldExtension> fieldList) {
if(listener != null) {
listener.getFieldExtensions().clear();
for (FieldExtension fieldModel : fieldList) {
FieldExtension fieldExtension = new FieldExtension();
listener.getFieldExtensions().add(fieldExtension);
fieldExtension.setFieldName(fieldModel.getFieldName());
fieldExtension.setStringValue(fieldModel.getStringValue());
fieldExtension.setExpression(fieldModel.getExpression());
}
}
}
}