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);
   }
 }
 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);
     }
   }
 }