package org.activiti.designer.property.ui; import java.util.Iterator; import java.util.List; import org.activiti.designer.model.FieldExtensionModel; import org.activiti.designer.util.BpmnBOUtil; import org.activiti.designer.util.eclipse.ActivitiUiUtil; import org.eclipse.bpmn2.ActivitiListener; import org.eclipse.bpmn2.Bpmn2Factory; import org.eclipse.bpmn2.FieldExtension; 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 += "� "; } fieldString += fieldExtension.getFieldname() + ":" + fieldExtension.getExpression(); } } tableItem.setText(3, fieldString); } } @Override protected String[] getNewInputObject() { AbstractListenerDialog dialog = getDialog(parent.getShell(), getItems()); dialog.open(); if(dialog.eventName != null && dialog.eventName.length() > 0 && dialog.implementation != null && dialog.implementation.length() > 0 && dialog.implementationType != null && dialog.implementationType.length() > 0) { 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(dialog.eventName != null && dialog.eventName.length() > 0 && dialog.implementation != null && dialog.implementation.length() > 0 && dialog.implementationType != null && dialog.implementationType.length() > 0) { 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<FieldExtensionModel> fieldList) { String fieldString = ""; if(fieldList != null) { for (FieldExtensionModel fieldExtension : fieldList) { if(fieldString.length() > 0) { fieldString += ", "; } fieldString += fieldExtension.fieldName + ":" + fieldExtension.expression; } } 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 = Bpmn2Factory.eINSTANCE.createActivitiListener(); newListener.setEvent(dialog.eventName); newListener.setImplementationType(dialog.implementationType); newListener.setImplementation(dialog.implementation); if("alfrescoScriptType".equalsIgnoreCase(dialog.implementationType)) { newListener.setRunAs(dialog.runAs); newListener.setScriptProcessor(dialog.scriptProcessor); } setFieldsInListener(newListener, dialog.fieldExtensionList); BpmnBOUtil.addListener(bo, newListener); } }, 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("alfrescoScriptType".equalsIgnoreCase(listener.getImplementationType())) { listener.setRunAs(dialog.runAs); listener.setScriptProcessor(dialog.scriptProcessor); } setFieldsInListener(listener, dialog.fieldExtensionList); BpmnBOUtil.setListener(bo, listener, index); } } }, 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); } }, editingDomain, "Model Update"); } } private void setFieldsInListener(ActivitiListener listener, List<FieldExtensionModel> fieldList) { if(fieldList == null || fieldList.size() == 0) { if(listener != null && listener.getFieldExtensions() != null && listener.getFieldExtensions().size() > 0) { removeFieldExtensionsNotInList(listener.getFieldExtensions(), null); } return; } for (FieldExtensionModel fieldModel : fieldList) { FieldExtension fieldExtension = fieldExtensionExists(listener.getFieldExtensions(), fieldModel.fieldName); if(fieldExtension == null) { fieldExtension = Bpmn2Factory.eINSTANCE.createFieldExtension(); listener.getFieldExtensions().add(fieldExtension); } fieldExtension.setFieldname(fieldModel.fieldName); fieldExtension.setExpression(fieldModel.expression); } removeFieldExtensionsNotInList(listener.getFieldExtensions(), fieldList); } private FieldExtension fieldExtensionExists(List<FieldExtension> fieldList, String fieldname) { if(fieldList == null) return null; for(FieldExtension fieldExtension : fieldList) { if(fieldname.equalsIgnoreCase(fieldExtension.getFieldname())) { return fieldExtension; } } return null; } private void removeFieldExtensionsNotInList(List<FieldExtension> fieldList, List<FieldExtensionModel> newfieldList) { Iterator<FieldExtension> entryIterator = fieldList.iterator(); while(entryIterator.hasNext()) { FieldExtension fieldExtension = entryIterator.next(); boolean found = false; if(newfieldList != null && newfieldList.size() > 0) { for (FieldExtensionModel field : newfieldList) { if(field.fieldName.equals(fieldExtension.getFieldname())) { found = true; break; } } } if(found == false) { diagram.eResource().getContents().remove(fieldExtension); entryIterator.remove(); } } } }