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.Assignment; import org.jbpm.gd.jpdl.model.BooleanType; import org.jbpm.gd.jpdl.model.Controller; import org.jbpm.gd.jpdl.model.Description; import org.jbpm.gd.jpdl.model.Event; import org.jbpm.gd.jpdl.model.PriorityType; import org.jbpm.gd.jpdl.model.Reminder; import org.jbpm.gd.jpdl.model.Task; import org.jbpm.gd.jpdl.model.Timer; public class TaskDomAdapter extends XmlAdapter { private static final String[] CHILD_ELEMENTS = {"description", "assignment", "controller", "event", "timer", "reminder"}; private static HashMap NODE_TYPES = null; protected String[] getChildElements() { return CHILD_ELEMENTS; } protected Map getNodeTypes() { if (NODE_TYPES == null) { NODE_TYPES = new HashMap(); NODE_TYPES.put("description", "description"); NODE_TYPES.put("assignment", "assignment"); NODE_TYPES.put("controller", "controller"); NODE_TYPES.put("event", "event"); NODE_TYPES.put("timer", "timer"); NODE_TYPES.put("reminder", "reminder"); } return NODE_TYPES; } protected String getDefaultValue(String attributeName) { if ("blocking".equals(attributeName)) { return BooleanType.FALSE; } else if ("signalling".equals(attributeName)) { return BooleanType.TRUE; } else if ("notify".equals(attributeName)) { return BooleanType.FALSE; } else if ("priority".equals(attributeName)) { return PriorityType.NORMAL; } else { return super.getDefaultValue(attributeName); } } protected void initialize() { super.initialize(); Task task = (Task)getSemanticElement(); if (task != null) { Map properties = task.getProperties(); Iterator iterator = properties.keySet().iterator(); while (iterator.hasNext()) { String key = (String)iterator.next(); setAttribute(key, (String)properties.get(key)); } setAttribute("name", task.getName()); setAttribute("blocking", task.getBlocking()); setAttribute("signalling", task.getSignalling()); setAttribute("duedate", task.getDueDate()); setAttribute("swimlane", task.getSwimlane()); setAttribute("priority", task.getPriority()); setAttribute("notify", task.getNotify()); addElement(task.getDescription()); addElement(task.getAssignment()); addElement(task.getController()); addElements(task.getEvents()); addElements(task.getTimers()); addElement(task.getReminder()); } } public void initialize(SemanticElement jpdlElement) { super.initialize(jpdlElement); Task task = (Task)jpdlElement; task.addPropertyChangeListener(this); Map map = getAttributes(); Iterator iterator = map.keySet().iterator(); while (iterator.hasNext()) { String next = (String)iterator.next(); if ("name".equals(next)) { task.setName(getAttribute("name")); } else if ("blocking".equals(next)) { task.setBlocking(getAttribute("blocking")); } else if ("signalling".equals(next)) { task.setSignalling(getAttribute("signalling")); } else if ("duedate".equals(next)) { task.setDueDate(getAttribute("duedate")); } else if ("swimlane".equals(next)) { task.setSwimlane(getAttribute("swimlane")); } else if ("priority".equals(next)) { task.setPriority(getAttribute("priority")); } else if ("notify".equals(next)) { task.setNotify(getAttribute("notify")); } task.setProperty(next, (String)map.get(next)); } } protected void doPropertyChange(PropertyChangeEvent evt) { if ("assignment".equals(evt.getPropertyName())) { setElement("assignment", (SemanticElement)evt.getOldValue(), (SemanticElement)evt.getNewValue()); } else if ("controller".equals(evt.getPropertyName())) { setElement("controller", (SemanticElement)evt.getOldValue(), (SemanticElement)evt.getNewValue()); } else if ("description".equals(evt.getPropertyName())) { setElement("description", (SemanticElement)evt.getOldValue(), (Description)evt.getNewValue()); } else if ("eventAdd".equals(evt.getPropertyName())) { addElement((Event)evt.getNewValue()); } else if ("eventRemove".equals(evt.getPropertyName())) { removeElement((Event)evt.getOldValue()); } else if ("timerAdd".equals(evt.getPropertyName())) { addElement((Timer)evt.getNewValue()); } else if ("timerRemove".equals(evt.getPropertyName())) { removeElement((Timer)evt.getOldValue()); } else if ("reminder".equals(evt.getPropertyName())) { setElement("reminder", (SemanticElement)evt.getOldValue(), (SemanticElement)evt.getNewValue()); } else if ("name".equals(evt.getPropertyName())) { setAttribute("name", (String)evt.getNewValue()); } else if ("blocking".equals(evt.getPropertyName())) { setAttribute("blocking", (String)evt.getNewValue()); } else if ("signalling".equals(evt.getPropertyName())) { setAttribute("signalling", (String)evt.getNewValue()); } else if ("notify".equals(evt.getPropertyName())) { setAttribute("notify", (String)evt.getNewValue()); } else if ("duedate".equals(evt.getPropertyName())) { setAttribute("duedate", (String)evt.getNewValue()); } else if ("swimlane".equals(evt.getPropertyName())) { setAttribute("swimlane", (String)evt.getNewValue()); } else if ("priority".equals(evt.getPropertyName())) { setAttribute("priority", (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) { Task task = (Task)getSemanticElement(); if ("name".equals(name)) { task.setName(newValue); } else if ("blocking".equals(name)) { task.setBlocking(newValue); } else if ("signalling".equals(name)) { task.setSignalling(newValue); } else if ("notify".equals(name)) { task.setNotify(newValue); } else if ("duedate".equals(name)) { task.setDueDate(newValue); } else if ("swimlane".equals(name)) { task.setSwimlane(newValue); } else if ("priority".equals(name)) { task.setPriority(newValue); } } protected void doModelAdd(XmlAdapter child) { String type = child.getElementType(); SemanticElement jpdlElement = createSemanticElementFor(child); child.initialize(jpdlElement); Task task = (Task)getSemanticElement(); if ("assignment".equals(type)) { task.setAssignment((Assignment)jpdlElement); } else if ("controller".equals(type)) { task.setController((Controller)jpdlElement); } else if ("event".equals(type)) { task.addEvent((Event)jpdlElement); } else if ("timer".equals(type)) { task.addTimer((Timer)jpdlElement); } else if ("description".equals(type)) { task.setDescription((Description)jpdlElement); } else if ("reminder".equals(type)) { task.setReminder((Reminder)jpdlElement); } } protected void doModelRemove(XmlAdapter child) { String type = child.getElementType(); Task task = (Task)getSemanticElement(); if ("assignment".equals(type)) { task.setAssignment(null); } else if ("controller".equals(type)) { task.setController(null); } else if ("event".equals(type)) { task.removeEvent((Event)child.getSemanticElement()); } else if ("timer".equals(type)) { task.removeTimer((Timer)child.getSemanticElement()); } else if ("description".equals(type)) { task.setDescription(null); } else if ("reminder".equals(type)) { task.setReminder(null); } } }