1 package org.opentrafficsim.road.network.factory.opendrive;
2
3 import java.io.Serializable;
4 import java.util.HashMap;
5 import java.util.Map;
6
7 import javax.naming.NamingException;
8
9 import org.opentrafficsim.core.gtu.GTUException;
10 import org.opentrafficsim.core.network.NetworkException;
11 import org.opentrafficsim.road.network.lane.object.trafficlight.SimpleTrafficLight;
12 import org.w3c.dom.NamedNodeMap;
13 import org.w3c.dom.Node;
14 import org.xml.sax.SAXException;
15
16 import nl.tudelft.simulation.dsol.simulators.DEVSSimulatorInterface;
17
18
19
20
21
22
23
24
25
26
27 class JunctionTag implements Serializable
28 {
29
30 private static final long serialVersionUID = 20150723L;
31
32
33 @SuppressWarnings("checkstyle:visibilitymodifier")
34 String name = null;
35
36
37 @SuppressWarnings("checkstyle:visibilitymodifier")
38 String id = null;
39
40
41 @SuppressWarnings("checkstyle:visibilitymodifier")
42 Map<String, ConnectionTag> connectionTags = new HashMap<String, ConnectionTag>();
43
44
45 @SuppressWarnings("checkstyle:visibilitymodifier")
46 Map<String, ControllerTag> controllerTags = new HashMap<String, ControllerTag>();
47
48
49
50
51
52
53
54
55 @SuppressWarnings("checkstyle:needbraces")
56 static void parseJunction(final Node node, final OpenDriveNetworkLaneParser parser) throws SAXException, NetworkException
57 {
58 NamedNodeMap attributes = node.getAttributes();
59 JunctionTag junctionTag = new JunctionTag();
60
61 Node id = attributes.getNamedItem("id");
62 if (id == null)
63 throw new SAXException("JUNCTION: missing attribute ID");
64 junctionTag.id = id.getNodeValue().trim();
65 if (parser.roadTags.keySet().contains(junctionTag.id))
66 throw new SAXException("JUNCTION: ID " + junctionTag.id + " defined twice");
67
68 Node name = attributes.getNamedItem("name");
69 if (name == null)
70 throw new SAXException("JUNCTION: missing attribute NAME for ID=" + junctionTag.id);
71 junctionTag.name = name.getNodeValue().trim();
72
73 for (Node connectionNode : XMLParser.getNodes(node.getChildNodes(), "connection"))
74 {
75 ConnectionTag connectionTag = ConnectionTag.parseConnection(connectionNode, parser);
76 junctionTag.connectionTags.put(connectionTag.connectingRoad, connectionTag);
77 }
78
79 for (Node connectionNode : XMLParser.getNodes(node.getChildNodes(), "controller"))
80 {
81 ControllerTag controllerTag = ControllerTag.parseController(connectionNode, parser);
82 junctionTag.controllerTags.put(controllerTag.id, controllerTag);
83 }
84
85 parser.junctionTags.put(junctionTag.id, junctionTag);
86 }
87
88
89
90
91
92
93
94
95
96 public static void createController(JunctionTag juncTag, DEVSSimulatorInterface.TimeDoubleUnit simulator,
97 OpenDriveNetworkLaneParser openDriveNetworkLaneParser) throws GTUException, NetworkException, NamingException
98 {
99 if (juncTag.controllerTags.size() > 0)
100 {
101 Controller controller = new Controller(juncTag.id, simulator);
102
103 for (ControllerTag controllerTag : juncTag.controllerTags.values())
104 {
105 int sequence = controllerTag.sequence;
106 String id = controllerTag.id;
107 String signalId = openDriveNetworkLaneParser.controllerTags.get(id).controlSignalID;
108
109
110
111 for (SimpleTrafficLight trafficLight : openDriveNetworkLaneParser.trafficLightsBySignals.get(signalId))
112 controller.addTrafficLight(sequence, trafficLight);
113
114
115
116
117
118
119 }
120 }
121 }
122
123
124 @Override
125 public final String toString()
126 {
127 return "JunctionTag [name=" + this.name + ", id=" + this.id + ", connectionTags=" + this.connectionTags
128 + ", controllerTags=" + this.controllerTags + "]";
129 }
130
131 }