1 package org.opentrafficsim.road.network.factory.xml.old;
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.lane.changing.LaneKeepingPolicy;
15 import org.opentrafficsim.road.network.lane.changing.OvertakingConditions;
16 import org.w3c.dom.NamedNodeMap;
17 import org.w3c.dom.Node;
18 import org.w3c.dom.NodeList;
19 import org.xml.sax.SAXException;
20
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 class RoadTypeTag implements Serializable
53 {
54
55 private static final long serialVersionUID = 20150723L;
56
57
58 @SuppressWarnings("checkstyle:visibilitymodifier")
59 String name = null;
60
61
62 @SuppressWarnings("checkstyle:visibilitymodifier")
63 Map<GTUType, Speed> legalSpeedLimits = new LinkedHashMap<>();
64
65
66 @SuppressWarnings("checkstyle:visibilitymodifier")
67 Length defaultLaneWidth = null;
68
69
70 @SuppressWarnings("checkstyle:visibilitymodifier")
71 LaneKeepingPolicy defaultLaneKeepingPolicy = null;
72
73
74 @SuppressWarnings("checkstyle:visibilitymodifier")
75 OvertakingConditions defaultOvertakingConditions = null;
76
77
78
79
80
81
82
83
84
85
86 @SuppressWarnings("checkstyle:needbraces")
87 static void parseRoadTypes(final NodeList nodeList, final XmlNetworkLaneParserOld parser)
88 throws SAXException, NetworkException
89 {
90 for (Node node : XMLParser.getNodes(nodeList, "ROADTYPE"))
91 {
92 RoadTypeTag roadTypeTag = parseRoadType(node, parser);
93 parser.roadTypeTags.put(roadTypeTag.name, roadTypeTag);
94 }
95 }
96
97
98
99
100
101
102
103
104
105 @SuppressWarnings("checkstyle:needbraces")
106 static RoadTypeTag parseRoadType(final Node node, final XmlNetworkLaneParserOld parser)
107 throws SAXException, NetworkException
108 {
109 NamedNodeMap attributes = node.getAttributes();
110 RoadTypeTag roadTypeTag = new RoadTypeTag();
111
112 Node name = attributes.getNamedItem("NAME");
113 if (name == null)
114 throw new SAXException("ROADTYPE: missing attribute NAME");
115 roadTypeTag.name = name.getNodeValue().trim();
116 if (parser.roadTypeTags.keySet().contains(roadTypeTag.name))
117 throw new SAXException("ROADTYPE: NAME " + roadTypeTag.name + " defined twice");
118
119 Node width = attributes.getNamedItem("DEFAULTLANEWIDTH");
120 if (width != null)
121 roadTypeTag.defaultLaneWidth = LengthUnits.parseLength(width.getNodeValue());
122
123 Node lkp = attributes.getNamedItem("DEFAULTLANEKEEPING");
124 if (lkp != null)
125 roadTypeTag.defaultLaneKeepingPolicy = LaneAttributes.parseLaneKeepingPolicy(lkp.getNodeValue().trim());
126
127 Node oc = attributes.getNamedItem("DEFAULTOVERTAKING");
128 if (oc != null)
129 roadTypeTag.defaultOvertakingConditions =
130 LaneAttributes.parseOvertakingConditions(oc.getNodeValue().trim(), parser);
131
132 List<Node> speedLimitList = XMLParser.getNodes(node.getChildNodes(), "SPEEDLIMIT");
133 if (speedLimitList.size() == 0)
134 throw new SAXException("ROADTYPE: missing tag SPEEDLIMIT");
135 for (Node speedLimitNode : speedLimitList)
136 {
137 NamedNodeMap speedLimitAttributes = speedLimitNode.getAttributes();
138
139 Node gtuTypeName = speedLimitAttributes.getNamedItem("GTUTYPE");
140 if (gtuTypeName == null)
141 throw new NetworkException("ROADTYPE: No GTUTYPE defined");
142 if (!parser.gtuTypes.containsKey(gtuTypeName.getNodeValue().trim()))
143 throw new NetworkException(
144 "ROADTYPE: " + roadTypeTag.name + " GTUTYPE " + gtuTypeName.getNodeValue().trim() + " not defined");
145 GTUType gtuType = parser.gtuTypes.get(gtuTypeName.getNodeValue().trim());
146
147 Node speedNode = speedLimitAttributes.getNamedItem("LEGALSPEEDLIMIT");
148 if (speedNode == null)
149 throw new NetworkException(
150 "ROADTYPE: " + roadTypeTag.name + " GTUTYPE " + gtuType.getId() + ": LEGALSPEEDLIMIT not defined");
151 Speed speed = SpeedUnits.parseSpeed(speedNode.getNodeValue().trim());
152
153 roadTypeTag.legalSpeedLimits.put(gtuType, speed);
154 }
155
156 return roadTypeTag;
157 }
158
159
160 @Override
161 public String toString()
162 {
163 return "RoadTypeTag [name=" + this.name + ", legalSpeedLimits=" + this.legalSpeedLimits + ", defaultLaneWidth="
164 + this.defaultLaneWidth + ", defaultLaneKeepingPolicy=" + this.defaultLaneKeepingPolicy
165 + ", defaultOvertakingConditions=" + this.defaultOvertakingConditions + "]";
166 }
167
168 }