1 package org.opentrafficsim.road.network.factory.vissim;
2
3 import java.io.Serializable;
4 import java.util.LinkedHashMap;
5 import java.util.List;
6 import java.util.Map;
7
8 import org.djunits.value.vdouble.scalar.Length;
9 import org.djunits.value.vdouble.scalar.Speed;
10 import org.opentrafficsim.core.gtu.GTUType;
11 import org.opentrafficsim.core.network.NetworkException;
12 import org.opentrafficsim.core.network.factory.xml.units.LengthUnits;
13 import org.opentrafficsim.core.network.factory.xml.units.SpeedUnits;
14 import org.opentrafficsim.road.network.factory.vissim.units.LaneAttributes;
15 import org.opentrafficsim.road.network.lane.changing.LaneKeepingPolicy;
16 import org.opentrafficsim.road.network.lane.changing.OvertakingConditions;
17 import org.w3c.dom.NamedNodeMap;
18 import org.w3c.dom.Node;
19 import org.w3c.dom.NodeList;
20 import org.xml.sax.SAXException;
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 class RoadTypeTag implements Serializable
54 {
55
56 private static final long serialVersionUID = 20150723L;
57
58
59 @SuppressWarnings("checkstyle:visibilitymodifier")
60 String name = null;
61
62
63 @SuppressWarnings("checkstyle:visibilitymodifier")
64 Map<GTUType, Speed> legalSpeedLimits = new LinkedHashMap<>();
65
66
67 @SuppressWarnings("checkstyle:visibilitymodifier")
68 Length defaultLaneWidth = null;
69
70
71 @SuppressWarnings("checkstyle:visibilitymodifier")
72 LaneKeepingPolicy defaultLaneKeepingPolicy = null;
73
74
75 @SuppressWarnings("checkstyle:visibilitymodifier")
76 OvertakingConditions defaultOvertakingConditions = null;
77
78
79
80
81
82
83
84
85
86
87 @SuppressWarnings("checkstyle:needbraces")
88 static void parseRoadTypes(final NodeList nodeList, final VissimNetworkLaneParser parser)
89 throws SAXException, NetworkException
90 {
91 for (Node node : XMLParser.getNodes(nodeList, "ROADTYPE"))
92 {
93 RoadTypeTag roadTypeTag = parseRoadType(node, parser);
94 parser.getRoadTypeTags().put(roadTypeTag.name, roadTypeTag);
95 }
96 }
97
98
99
100
101
102
103
104
105
106 @SuppressWarnings("checkstyle:needbraces")
107 static RoadTypeTag parseRoadType(final Node node, final VissimNetworkLaneParser parser)
108 throws SAXException, NetworkException
109 {
110 NamedNodeMap attributes = node.getAttributes();
111 RoadTypeTag roadTypeTag = new RoadTypeTag();
112
113 Node name = attributes.getNamedItem("NAME");
114 if (name == null)
115 {
116 throw new SAXException("ROADTYPE: missing attribute NAME");
117 }
118 roadTypeTag.name = name.getNodeValue().trim();
119 if (parser.getRoadTypeTags().keySet().contains(roadTypeTag.name))
120 {
121 throw new SAXException("ROADTYPE: NAME " + roadTypeTag.name + " defined twice");
122 }
123
124 Node width = attributes.getNamedItem("DEFAULTLANEWIDTH");
125 if (width != null)
126 {
127 roadTypeTag.defaultLaneWidth = LengthUnits.parseLength(width.getNodeValue());
128 }
129
130 Node lkp = attributes.getNamedItem("DEFAULTLANEKEEPING");
131 if (lkp != null)
132 {
133 roadTypeTag.defaultLaneKeepingPolicy = LaneAttributes.parseLaneKeepingPolicy(lkp.getNodeValue().trim());
134 }
135
136
137
138
139
140
141
142 List<Node> speedLimitList = XMLParser.getNodes(node.getChildNodes(), "SPEEDLIMIT");
143 if (speedLimitList.size() == 0)
144 {
145 throw new SAXException("ROADTYPE: missing tag SPEEDLIMIT");
146 }
147 for (Node speedLimitNode : speedLimitList)
148 {
149 NamedNodeMap speedLimitAttributes = speedLimitNode.getAttributes();
150
151 Node gtuTypeName = speedLimitAttributes.getNamedItem("GTUTYPE");
152 if (gtuTypeName == null)
153 {
154 throw new NetworkException("ROADTYPE: No GTUTYPE defined");
155 }
156 if (!parser.getGtuTypes().containsKey(gtuTypeName.getNodeValue().trim()))
157 {
158 throw new NetworkException(
159 "ROADTYPE: " + roadTypeTag.name + " GTUTYPE " + gtuTypeName.getNodeValue().trim() + " not defined");
160 }
161 GTUType gtuType = parser.getGtuTypes().get(gtuTypeName.getNodeValue().trim());
162
163 Node speedNode = speedLimitAttributes.getNamedItem("LEGALSPEEDLIMIT");
164 if (speedNode == null)
165 {
166 throw new NetworkException(
167 "ROADTYPE: " + roadTypeTag.name + " GTUTYPE " + gtuType.getId() + ": LEGALSPEEDLIMIT not defined");
168 }
169 Speed speed = SpeedUnits.parseSpeed(speedNode.getNodeValue().trim());
170
171 roadTypeTag.legalSpeedLimits.put(gtuType, speed);
172 }
173
174 return roadTypeTag;
175 }
176
177
178 @Override
179 public String toString()
180 {
181 return "RoadTypeTag [name=" + this.name + ", legalSpeedLimits=" + this.legalSpeedLimits + ", defaultLaneWidth="
182 + this.defaultLaneWidth + ", defaultLaneKeepingPolicy=" + this.defaultLaneKeepingPolicy
183 + ", defaultOvertakingConditions=" + this.defaultOvertakingConditions + "]";
184 }
185
186 }