1
2
3
4
5
6
7
8
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
27
28
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
42 NodeMetadata node = new NodeMetadata();
43
44
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
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
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
93 applyKeys(node);
94
95 return node;
96
97 } catch (Exception e) {
98 ExceptionConverter.convert(e);
99 }
100
101 return null;
102 }
103 }