package org.jbpm.gd.jpdl.notation; import java.beans.PropertyChangeEvent; import java.util.List; import java.util.StringTokenizer; import org.jbpm.gd.common.editor.CreationFactory; import org.jbpm.gd.common.model.SemanticElement; import org.jbpm.gd.common.notation.Edge; import org.jbpm.gd.common.notation.Node; import org.jbpm.gd.common.notation.NotationElement; import org.jbpm.gd.jpdl.model.NodeElementContainer; import org.jbpm.gd.jpdl.model.Transition; public class JpdlNode extends Node { public void propertyChange(PropertyChangeEvent evt) { String eventName = evt.getPropertyName(); if (eventName.equals("name")) { firePropertyChange(evt.getPropertyName(), evt.getOldValue(), evt.getNewValue()); updateArrivingEdges((String)evt.getNewValue()); } else if (eventName.equals("transitionAdd")) { Transition transition = (Transition)evt.getNewValue(); Edge edge = (Edge)getRegisteredNotationElementFor(transition); if (edge == null) { CreationFactory factory = new CreationFactory(transition, getFactory()); edge = (Edge)factory.getNewObject(); } addLeavingEdge(edge); transition.addPropertyChangeListener(edge); Node targetNode = getDestinationNode(transition.getTo()); if (targetNode != null) { targetNode.addArrivingEdge(edge); } } else if (eventName.equals("transitionRemove")) { Transition transition = (Transition)evt.getOldValue(); Edge edge = (Edge)getRegisteredNotationElementFor(transition); if (edge != null) { Node targetNode = edge.getTarget(); if (targetNode != null) { transition.removePropertyChangeListener(edge); targetNode.removeArrivingEdge(edge); } removeLeavingEdge(edge); // edge.unregister(); } } else { super.propertyChange(evt); } } private void updateArrivingEdges(String to) { List edges = getArrivingEdges(); for (int i = 0; i < edges.size(); i++) { Edge edge = (Edge)edges.get(i); ((SemanticElement)edge.getSemanticElement()).removePropertyChangeListener(edge); ((Transition)edge.getSemanticElement()).setTo(to); ((SemanticElement)edge.getSemanticElement()).addPropertyChangeListener(edge); } } private Node getDestinationNode(String to) { if (to == null) return null; NotationElement runner = getContainer(); SemanticElement jpdlElement = null; StringTokenizer tokenizer = new StringTokenizer(to, "/"); while (tokenizer.hasMoreTokens()) { String nextToken = tokenizer.nextToken(); if ("..".equals(nextToken)) { if (runner != null && runner instanceof Node) { runner = ((Node)runner).getContainer(); } else { runner = null; break; } } else { if (jpdlElement == null) { jpdlElement = (SemanticElement)runner.getSemanticElement(); } if (jpdlElement instanceof NodeElementContainer) { jpdlElement = ((NodeElementContainer)jpdlElement).getNodeElementByName(nextToken); runner = (Node)getRegisteredNotationElementFor(jpdlElement); } else { runner = null; break; } } } return runner == getContainer() ? null : (Node)runner; } }