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 port elements.
27   *
28   * @author Nathan Mittler - nathan.mittler@gmail.com
29   */
30  public class PortElementParser<G extends Hypergraph<V,E>,V,E> extends AbstractElementParser<G,V,E> {
31  
32      public PortElementParser(ParserContext<G,V,E> parserContext) {
33          super(parserContext);
34      }
35      
36      public PortMetadata parse(XMLEventReader xmlEventReader, StartElement start)
37              throws GraphIOException {
38  
39          try {
40              
41              // Create the new port.
42              PortMetadata port = new PortMetadata();
43  
44              // Parse the attributes.
45              @SuppressWarnings("unchecked")
46              Iterator<Attribute> iterator = start.getAttributes();
47              while (iterator.hasNext()) {
48                  Attribute attribute = iterator.next();
49                  String name = attribute.getName().getLocalPart();
50                  String value = attribute.getValue();
51                  if (port.getName() == null && GraphMLConstants.NAME_NAME.equals(name)) {
52                      port.setName(value);
53                  } else {
54                      port.setProperty(name, value);
55                  }
56              }
57  
58              // Make sure the name has been set.
59              if (port.getName() == null) {
60                  throw new GraphIOException(
61                          "Element 'port' is missing attribute 'name'");
62              }
63  
64              while (xmlEventReader.hasNext()) {
65  
66                  XMLEvent event = xmlEventReader.nextEvent();
67                  if (event.isStartElement()) {
68                      StartElement element = (StartElement) event;
69  
70                      String name = element.getName().getLocalPart();
71                      if(GraphMLConstants.DESC_NAME.equals(name)) {
72                          String desc = (String)getParser(name).parse(xmlEventReader, element);
73                          port.setDescription(desc);
74                      } else if(GraphMLConstants.DATA_NAME.equals(name)) {
75                          DataMetadata data = (DataMetadata)getParser(name).parse(xmlEventReader, element);
76                          port.addData(data);
77                      } else {
78                          
79                          // Treat anything else as unknown
80                          getUnknownParser().parse(xmlEventReader, element);
81                      }
82  
83                  }
84                  if (event.isEndElement()) {
85                      EndElement end = (EndElement) event;
86                      verifyMatch(start, end);
87                      break;
88                  }
89              }
90              
91              // Apply the keys to this port.
92              applyKeys(port);
93  
94              return port;
95              
96          } catch (Exception e) {
97              ExceptionConverter.convert(e);
98          }
99  
100         return null;
101     }
102 }