private void write(String indent, Node node, Element element) {
   boolean childAdded = false;
   addText(indent, element);
   Element newElement = null;
   if (node instanceof AbstractNodeContainer) {
     newElement = addElement(element, "node-container");
   } else {
     newElement = addElement(element, "node");
   }
   addAttribute(newElement, "name", ((NamedElement) node.getSemanticElement()).getName());
   addAttribute(newElement, "x", String.valueOf(node.getConstraint().x));
   addAttribute(newElement, "y", String.valueOf(node.getConstraint().y));
   addAttribute(newElement, "width", String.valueOf(node.getConstraint().width));
   addAttribute(newElement, "height", String.valueOf(node.getConstraint().height));
   if (node instanceof AbstractNodeContainer) {
     Iterator nodes = ((AbstractNodeContainer) node).getNodes().iterator();
     while (nodes.hasNext()) {
       childAdded = true;
       write(indent + "  ", (Node) nodes.next(), newElement);
     }
   }
   Iterator edges = node.getLeavingEdges().iterator();
   while (edges.hasNext()) {
     childAdded = true;
     Edge edge = (Edge) edges.next();
     addText(indent + "  ", newElement);
     Element newEdge = addElement(newElement, "edge");
     write(indent + "  ", edge, newEdge);
   }
   if (childAdded) {
     addText(indent, newElement);
   }
 }
 protected void addEdge(Node node, SemanticElement semanticElement, Element notationInfoElement) {
   NotationElement notationElement = node.getRegisteredNotationElementFor(semanticElement);
   if (notationElement == null) {
     String notationElementId =
         NotationMapping.getNotationElementId(semanticElement.getElementId());
     notationElement = (NotationElement) node.getFactory().create(notationElementId);
     notationElement.setSemanticElement(semanticElement);
     notationElement.register();
     node.addLeavingEdge((Edge) notationElement);
     semanticElement.addPropertyChangeListener(notationElement);
   }
   processEdge((Edge) notationElement, notationInfoElement);
 }
 protected void addNode(
     NodeContainer nodeContainer, SemanticElement semanticElement, Element notationInfoElement) {
   String notationElementId = NotationMapping.getNotationElementId(semanticElement.getElementId());
   Node notationElement = (Node) nodeContainer.getFactory().create(notationElementId);
   notationElement.setSemanticElement(semanticElement);
   notationElement.register();
   nodeContainer.addNode(notationElement);
   semanticElement.addPropertyChangeListener(notationElement);
   processNode(notationElement, notationInfoElement);
   if (notationElement instanceof NodeContainer) {
     addNodes((NodeContainer) notationElement, notationInfoElement);
   }
 }
 private void addConstraint(Node node, Element nodeInfo) {
   Rectangle constraint = node.getConstraint().getCopy();
   Dimension initialDimension =
       NotationMapping.getInitialDimension(node.getSemanticElement().getElementId());
   if (initialDimension != null) {
     constraint.setSize(initialDimension);
   }
   if (nodeInfo != null) {
     constraint.x = Integer.valueOf(getAttribute(nodeInfo, "x")).intValue();
     constraint.y = Integer.valueOf(getAttribute(nodeInfo, "y")).intValue();
     constraint.width = Integer.valueOf(getAttribute(nodeInfo, "width")).intValue();
     constraint.height = Integer.valueOf(getAttribute(nodeInfo, "height")).intValue();
   }
   node.setConstraint(constraint);
 }
 protected void postProcess(NodeContainer nodeContainer) {
   List nodes = nodeContainer.getNodes();
   for (int i = 0; i < nodes.size(); i++) {
     Node node = (Node) nodes.get(i);
     List edges = node.getLeavingEdges();
     for (int j = 0; j < edges.size(); j++) {
       Edge edge = (Edge) edges.get(j);
       SemanticElement destination = findDestination(edge, node);
       Node target = (Node) edge.getFactory().getRegisteredNotationElementFor(destination);
       if (target != null && edge.getTarget() == null) {
         target.addArrivingEdge(edge);
       }
     }
     if (node instanceof NodeContainer) {
       postProcess((NodeContainer) node);
     }
   }
 }