package org.jbpm.gd.jpdl.xml; import java.beans.PropertyChangeEvent; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.jbpm.gd.common.model.SemanticElement; import org.jbpm.gd.common.xml.XmlAdapter; import org.jbpm.gd.jpdl.model.AbstractNode; import org.jbpm.gd.jpdl.model.ActionElement; import org.jbpm.gd.jpdl.model.Description; import org.jbpm.gd.jpdl.model.Event; import org.jbpm.gd.jpdl.model.ExceptionHandler; import org.jbpm.gd.jpdl.model.ProcessDefinition; import org.jbpm.gd.jpdl.model.StartState; import org.jbpm.gd.jpdl.model.Swimlane; import org.jbpm.gd.jpdl.model.Task; public class ProcessDefinitionDomAdapter extends XmlAdapter { private static HashMap NODE_TYPES = null; private static String[] CHILD_ELEMENTS = { "description", "swimlane", "start-state", "node-element", "end-state", "action-element", "event", "exception-handler", "task" }; private static final String INTER_NODE_TYPE_SPACING = "\n\n\n"; private static final String INTER_CHILD_SPACING = "\n\n"; protected String getInterNodeTypeSpacing() { return INTER_NODE_TYPE_SPACING; } protected String getInterChildSpacing() { return INTER_CHILD_SPACING; } protected String[] getChildElements() { return CHILD_ELEMENTS; } public Map getNodeTypes() { if (NODE_TYPES == null) { NODE_TYPES = new HashMap(); NODE_TYPES.put("description", "description"); NODE_TYPES.put("swimlane", "swimlane"); NODE_TYPES.put("start-state", "start-state"); NODE_TYPES.put("node", "node-element"); NODE_TYPES.put("state", "node-element"); NODE_TYPES.put("task-node", "node-element"); NODE_TYPES.put("super-state", "node-element"); NODE_TYPES.put("process-state", "node-element"); NODE_TYPES.put("fork", "node-element"); NODE_TYPES.put("join", "node-element"); NODE_TYPES.put("decision", "node-element"); NODE_TYPES.put("mail-node", "node-element"); NODE_TYPES.put("end-state", "end-state"); NODE_TYPES.put("action", "action-element"); NODE_TYPES.put("script", "action-element"); NODE_TYPES.put("create-timer", "action-element"); NODE_TYPES.put("cancel-timer", "action-element"); NODE_TYPES.put("mail", "action-element"); NODE_TYPES.put("event", "event"); NODE_TYPES.put("exception-handler", "exception-handler"); NODE_TYPES.put("task", "task"); } return NODE_TYPES; } protected void initialize() { super.initialize(); ProcessDefinition processDefinition = (ProcessDefinition)getSemanticElement(); if (processDefinition != null) { Map properties = processDefinition.getProperties(); Iterator iterator = properties.keySet().iterator(); while (iterator.hasNext()) { String key = (String)iterator.next(); setAttribute(key, (String)properties.get(key)); } setAttribute("name", processDefinition.getName()); addElement(processDefinition.getDescription()); addElements(processDefinition.getSwimlanes()); addElement(processDefinition.getStartState()); addElements(processDefinition.getNodeElements()); addElements(processDefinition.getActionElements()); addElements(processDefinition.getEvents()); addElements(processDefinition.getExceptionHandlers()); addElements(processDefinition.getTasks()); } } public void initialize(SemanticElement jpdlElement) { super.initialize(jpdlElement); ProcessDefinition processDefinition = (ProcessDefinition)jpdlElement; Map map = getAttributes(); Iterator iterator = map.keySet().iterator(); while (iterator.hasNext()) { String next = (String)iterator.next(); if ("name".equals(next)) { processDefinition.setName(getAttribute("name")); } processDefinition.setProperty(next, (String)map.get(next)); } processDefinition.addPropertyChangeListener(this); } protected void doPropertyChange(PropertyChangeEvent evt) { if ("swimlaneAdd".equals(evt.getPropertyName())) { addElement((Swimlane)evt.getNewValue()); } else if ("swimlaneRemove".equals(evt.getPropertyName())) { removeElement((Swimlane)evt.getOldValue()); } else if ("startStateAdd".equals(evt.getPropertyName())) { addElement((StartState)evt.getNewValue()); } else if ("startStateRemove".equals(evt.getPropertyName())) { removeElement((StartState)evt.getOldValue()); } else if ("nodeElementAdd".equals(evt.getPropertyName())) { addElement((SemanticElement)evt.getNewValue()); } else if ("nodeElementRemove".equals(evt.getPropertyName())) { removeElement((SemanticElement)evt.getOldValue()); } else if ("actionElementAdd".equals(evt.getPropertyName())) { addElement((SemanticElement)evt.getNewValue()); } else if ("actionElementRemove".equals(evt.getPropertyName())) { removeElement((SemanticElement)evt.getOldValue()); } else if ("eventAdd".equals(evt.getPropertyName())) { addElement((Event)evt.getNewValue()); } else if ("eventRemove".equals(evt.getPropertyName())) { removeElement((Event)evt.getOldValue()); } else if ("exceptionHandlerAdd".equals(evt.getPropertyName())) { addElement((ExceptionHandler)evt.getNewValue()); } else if ("exceptionHandlerRemove".equals(evt.getPropertyName())) { removeElement((ExceptionHandler)evt.getOldValue()); } else if ("taskAdd".equals(evt.getPropertyName())) { addElement((Task)evt.getNewValue()); } else if ("taskRemove".equals(evt.getPropertyName())) { removeElement((Task)evt.getOldValue()); } else if ("description".equals(evt.getPropertyName())) { setElement("description", (Description)evt.getOldValue(), (Description)evt.getNewValue()); } else if ("name".equals(evt.getPropertyName())) { setAttribute("name", (String)evt.getNewValue()); } else if ("custom".equals(evt.getPropertyName())) { String name = ((String[])evt.getNewValue())[0]; String newValue = ((String[])evt.getNewValue())[1]; setAttribute(name, newValue); } } protected void doModelUpdate(String name, String newValue) { ProcessDefinition processDefinition = (ProcessDefinition)getSemanticElement(); if ("name".equals(name)) { processDefinition.setName(newValue); } } protected SemanticElement createSemanticElementFor(XmlAdapter child) { SemanticElement result = super.createSemanticElementFor(child); child.initialize(result); return result; } protected SemanticElement getSemanticElementFor(XmlAdapter child) { return child.getSemanticElement() != null ? child.getSemanticElement() : createSemanticElementFor(child); } protected void doModelAdd(XmlAdapter child) { SemanticElement jpdlElement = getSemanticElementFor(child); if (jpdlElement == null) return; String type = child.getElementType(); ProcessDefinition processDefinition = (ProcessDefinition)getSemanticElement(); if ("swimlane".equals(type)) { processDefinition.addSwimlane((Swimlane)jpdlElement); } else if ("start-state".equals(type)) { processDefinition.addStartState((StartState)jpdlElement); } else if ("node".equals(type)) { processDefinition.addNodeElement((AbstractNode)jpdlElement); } else if ("state".equals(type)) { processDefinition.addNodeElement((AbstractNode)jpdlElement); } else if ("task-node".equals(type)) { processDefinition.addNodeElement((AbstractNode)jpdlElement); } else if ("super-state".equals(type)) { processDefinition.addNodeElement((AbstractNode)jpdlElement); } else if ("process-state".equals(type)) { processDefinition.addNodeElement((AbstractNode)jpdlElement); } else if ("fork".equals(type)) { processDefinition.addNodeElement((AbstractNode)jpdlElement); } else if ("join".equals(type)) { processDefinition.addNodeElement((AbstractNode)jpdlElement); } else if ("decision".equals(type)) { processDefinition.addNodeElement((AbstractNode)jpdlElement); } else if ("mail-node".equals(type)) { processDefinition.addNodeElement((AbstractNode)jpdlElement); } else if ("end-state".equals(type)) { processDefinition.addNodeElement((AbstractNode)jpdlElement); } else if ("action".equals(type)) { processDefinition.addActionElement((ActionElement)jpdlElement); } else if ("script".equals(type)) { processDefinition.addActionElement((ActionElement)jpdlElement); } else if ("create-timer".equals(type)) { processDefinition.addActionElement((ActionElement)jpdlElement); } else if ("cancel-timer".equals(type)) { processDefinition.addActionElement((ActionElement)jpdlElement); } else if ("mail".equals(type)) { processDefinition.addActionElement((ActionElement)jpdlElement); } else if ("event".equals(type)) { processDefinition.addEvent((Event)jpdlElement); } else if ("exception-handler".equals(type)) { processDefinition.addExceptionHandler((ExceptionHandler)jpdlElement); } else if ("task".equals(type)) { processDefinition.addTask((Task)jpdlElement); } else if ("node-element".equals(getNodeType(type))) { processDefinition.addNodeElement((AbstractNode)jpdlElement); } else if ("action-element".equals(getNodeType(type))) { processDefinition.addActionElement((ActionElement)jpdlElement); } else if ("description".equals(getNodeType(type))) { processDefinition.setDescription((Description)jpdlElement); } } protected void doModelRemove(XmlAdapter child) { if (child.getSemanticElement() == null) return; String type = child.getElementType(); ProcessDefinition processDefinition = (ProcessDefinition)getSemanticElement(); if ("swimlane".equals(type)) { processDefinition.removeSwimlane((Swimlane)child.getSemanticElement()); } else if ("start-state".equals(type)) { processDefinition.removeStartState((StartState)child.getSemanticElement()); } else if ("node".equals(type)) { processDefinition.removeNodeElement((AbstractNode)child.getSemanticElement()); } else if ("state".equals(type)) { processDefinition.removeNodeElement((AbstractNode)child.getSemanticElement()); } else if ("task-node".equals(type)) { processDefinition.removeNodeElement((AbstractNode)child.getSemanticElement()); } else if ("super-state".equals(type)) { processDefinition.removeNodeElement((AbstractNode)child.getSemanticElement()); } else if ("process-state".equals(type)) { processDefinition.removeNodeElement((AbstractNode)child.getSemanticElement()); } else if ("fork".equals(type)) { processDefinition.removeNodeElement((AbstractNode)child.getSemanticElement()); } else if ("join".equals(type)) { processDefinition.removeNodeElement((AbstractNode)child.getSemanticElement()); } else if ("decision".equals(type)) { processDefinition.removeNodeElement((AbstractNode)child.getSemanticElement()); } else if ("mail-node".equals(type)) { processDefinition.removeNodeElement((AbstractNode)child.getSemanticElement()); } else if ("end-state".equals(type)) { processDefinition.removeNodeElement((AbstractNode)child.getSemanticElement()); } else if ("action".equals(type)) { processDefinition.removeActionElement((ActionElement)child.getSemanticElement()); } else if ("script".equals(type)) { processDefinition.removeActionElement((ActionElement)child.getSemanticElement()); } else if ("create-timer".equals(type)) { processDefinition.removeActionElement((ActionElement)child.getSemanticElement()); } else if ("cancel-timer".equals(type)) { processDefinition.removeActionElement((ActionElement)child.getSemanticElement()); } else if ("mail".equals(type)) { processDefinition.removeActionElement((ActionElement)child.getSemanticElement()); } else if ("event".equals(type)) { processDefinition.removeEvent((Event)child.getSemanticElement()); } else if ("exception-handler".equals(type)) { processDefinition.removeExceptionHandler((ExceptionHandler)child.getSemanticElement()); } else if ("task".equals(type)) { processDefinition.removeTask((Task)child.getSemanticElement()); } else if ("node-element".equals(getNodeType(type))) { processDefinition.addNodeElement((AbstractNode)child.getSemanticElement()); } else if ("action-element".equals(getNodeType(type))) { processDefinition.addActionElement((ActionElement)child.getSemanticElement()); } else if ("description".equals(getNodeType(type))) { processDefinition.setDescription(null); } } }