View Javadoc
1   /*
2    * Copyright (c) 2008, The JUNG Authors
3    *
4    * All rights reserved.
5    *
6    * This software is open-source under the BSD license; see either
7    * "license.txt" or
8    * https://github.com/jrtom/jung/blob/master/LICENSE for a description.
9    */
10  
11  package edu.uci.ics.jung.io.graphml.parser;
12  
13  import java.util.Iterator;
14  
15  import javax.xml.stream.XMLEventReader;
16  import javax.xml.stream.events.Attribute;
17  import javax.xml.stream.events.EndElement;
18  import javax.xml.stream.events.StartElement;
19  import javax.xml.stream.events.XMLEvent;
20  
21  import edu.uci.ics.jung.graph.Hypergraph;
22  import edu.uci.ics.jung.io.GraphIOException;
23  import edu.uci.ics.jung.io.graphml.*;
24  
25  /**
26   * Parses node elements.
27   *
28   * @author Nathan Mittler - nathan.mittler@gmail.com
29   */
30  public class NodeElementParser<G extends Hypergraph<V,E>,V,E> extends AbstractElementParser<G,V,E> {
31  
32      public NodeElementParser(ParserContext<G,V,E> parserContext) {
33          super(parserContext);
34      }
35      
36      @SuppressWarnings("unchecked")
37      public NodeMetadata parse(XMLEventReader xmlEventReader, StartElement start)
38              throws GraphIOException {
39  
40          try {
41              // Create the new node.
42              NodeMetadata node = new NodeMetadata();
43  
44              // Parse the attributes.
45              Iterator<Attribute> iterator = start.getAttributes();
46              while (iterator.hasNext()) {
47                  Attribute attribute = iterator.next();
48                  String name = attribute.getName().getLocalPart();
49                  String value = attribute.getValue();
50                  if (node.getId() == null && GraphMLConstants.ID_NAME.equals(name)) {
51                      node.setId(value);
52                  } else {
53                      node.setProperty(name, value);
54                  }
55              }
56  
57              // Make sure the name has been set.
58              if (node.getId() == null) {
59                  throw new GraphIOException(
60                          "Element 'node' is missing attribute 'id'");
61              }
62  
63              while (xmlEventReader.hasNext()) {
64  
65                  XMLEvent event = xmlEventReader.nextEvent();
66                  if (event.isStartElement()) {
67                      StartElement element = (StartElement) event;
68  
69                      String name = element.getName().getLocalPart();
70                      if(GraphMLConstants.DESC_NAME.equals(name)) {
71                          String desc = (String)getParser(name).parse(xmlEventReader, element);
72                          node.setDescription(desc);
73                      } else if(GraphMLConstants.DATA_NAME.equals(name)) {
74                          DataMetadata data = (DataMetadata)getParser(name).parse(xmlEventReader, element);
75                          node.addData(data);
76                      } else if(GraphMLConstants.PORT_NAME.equals(name)) {
77                          PortMetadata port = (PortMetadata)getParser(name).parse(xmlEventReader, element);
78                          node.addPort(port);
79                      } else {
80                          
81                          // Treat anything else as unknown
82                          getUnknownParser().parse(xmlEventReader, element);
83                      }
84  
85                  } else if (event.isEndElement()) {
86                      EndElement end = (EndElement) event;
87                      verifyMatch(start, end);
88                      break;
89                  }
90              }
91              
92              // Apply the keys to this object.
93              applyKeys(node);
94  
95              return node;
96              
97          } catch (Exception e) {
98              ExceptionConverter.convert(e);
99          }
100 
101         return null;
102     }
103 }