1 package loadfromxml;
2
3 import java.awt.Dimension;
4 import java.io.ByteArrayInputStream;
5 import java.io.File;
6 import java.io.IOException;
7 import java.io.Serializable;
8 import java.net.URISyntaxException;
9 import java.nio.charset.StandardCharsets;
10 import java.nio.file.Files;
11 import java.nio.file.Paths;
12 import java.util.LinkedHashMap;
13 import java.util.Map;
14
15 import javax.naming.NamingException;
16 import javax.swing.JFileChooser;
17 import javax.swing.JOptionPane;
18 import javax.swing.filechooser.FileFilter;
19 import javax.xml.bind.JAXBException;
20 import javax.xml.parsers.ParserConfigurationException;
21
22 import org.djunits.value.vdouble.scalar.Duration;
23 import org.djunits.value.vdouble.scalar.Length;
24 import org.djunits.value.vdouble.scalar.Time;
25 import org.opentrafficsim.core.dsol.AbstractOTSModel;
26 import org.opentrafficsim.core.dsol.OTSAnimator;
27 import org.opentrafficsim.core.dsol.OTSModelInterface;
28 import org.opentrafficsim.core.dsol.OTSSimulationException;
29 import org.opentrafficsim.core.dsol.OTSSimulatorInterface;
30 import org.opentrafficsim.core.geometry.OTSGeometryException;
31 import org.opentrafficsim.core.gtu.GTUException;
32 import org.opentrafficsim.core.gtu.GTUType;
33 import org.opentrafficsim.core.network.NetworkException;
34 import org.opentrafficsim.draw.core.OTSDrawingException;
35 import org.opentrafficsim.road.network.OTSRoadNetwork;
36 import org.opentrafficsim.road.network.factory.xml.XmlParserException;
37 import org.opentrafficsim.road.network.factory.xml.parser.XmlNetworkLaneParser;
38 import org.opentrafficsim.road.network.lane.CrossSectionLink;
39 import org.opentrafficsim.road.network.lane.conflict.ConflictBuilder;
40 import org.opentrafficsim.road.network.lane.conflict.LaneCombinationList;
41 import org.opentrafficsim.swing.gui.OTSAnimationPanel;
42 import org.opentrafficsim.swing.gui.OTSSimulationApplication;
43 import org.opentrafficsim.trafficcontrol.TrafficControlException;
44 import org.xml.sax.SAXException;
45
46 import nl.tudelft.simulation.dsol.SimRuntimeException;
47 import nl.tudelft.simulation.dsol.model.inputparameters.InputParameterException;
48 import nl.tudelft.simulation.jstats.streams.MersenneTwister;
49 import nl.tudelft.simulation.jstats.streams.StreamInterface;
50 import nl.tudelft.simulation.language.DSOLException;
51
52
53
54
55
56
57
58
59
60
61
62
63 public class LoadXML extends OTSSimulationApplication<OTSModelInterface>
64 {
65
66 private static final long serialVersionUID = 20170421L;
67
68
69
70
71
72
73 public LoadXML(final OTSModelInterface model, final OTSAnimationPanel animationPanel) throws OTSDrawingException
74 {
75 super(model, animationPanel);
76 }
77
78
79
80
81
82
83
84
85
86
87
88 public static void main(final String[] args) throws IOException, SimRuntimeException, NamingException,
89 OTSSimulationException, InputParameterException, DSOLException
90 {
91 String fileName;
92 String xml;
93 if (0 == args.length)
94 {
95 JFileChooser fileChooser = new JFileChooser();
96 fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
97 fileChooser.addChoosableFileFilter(new FileFilter()
98 {
99
100 @Override
101 public boolean accept(final File f)
102 {
103 if (f.isDirectory())
104 {
105 return true;
106 }
107 String name = f.getName();
108 int length = name.length();
109 if (length < 5)
110 {
111 return false;
112 }
113 String type = name.substring(length - 4);
114 return type.equalsIgnoreCase(".xml");
115 }
116
117 @Override
118 public String getDescription()
119 {
120 return "XML files";
121 }
122 });
123 fileChooser.removeChoosableFileFilter(fileChooser.getAcceptAllFileFilter());
124 if (JFileChooser.APPROVE_OPTION != fileChooser.showOpenDialog(null))
125 {
126 System.out.println("No file chosen; exiting");
127 System.exit(0);
128 }
129 fileName = fileChooser.getSelectedFile().getAbsolutePath();
130 }
131 else
132 {
133 fileName = args[0];
134 }
135 xml = new String(Files.readAllBytes(Paths.get(fileName)));
136 try
137 {
138 OTSAnimator simulator = new OTSAnimator("LoadXML");
139 XMLModel xmlModel = new XMLModel(simulator, "XML model", "Model built from XML file " + fileName, xml);
140 Map<String, StreamInterface> map = new LinkedHashMap<>();
141
142 map.put("generation", new MersenneTwister(6L));
143 simulator.initialize(Time.ZERO, Duration.ZERO, Duration.instantiateSI(3600.0), xmlModel, map);
144 OTSAnimationPanel animationPanel = new OTSAnimationPanel(xmlModel.getNetwork().getExtent(), new Dimension(800, 600),
145 simulator, xmlModel, DEFAULT_COLORER, xmlModel.getNetwork());
146 new LoadXML(xmlModel, animationPanel);
147 }
148 catch (SimRuntimeException | OTSDrawingException sre)
149 {
150 JOptionPane.showMessageDialog(null, sre.getMessage(), "Exception occured", JOptionPane.ERROR_MESSAGE);
151 System.exit(1);
152 }
153 }
154
155
156
157
158 static class XMLModel extends AbstractOTSModel
159 {
160
161 private static final long serialVersionUID = 20170421L;
162
163
164 private OTSRoadNetwork network;
165
166
167 private final String xml;
168
169
170
171
172
173
174
175 XMLModel(final OTSSimulatorInterface simulator, final String shortName, final String description, final String xml)
176 {
177 super(simulator, shortName, description);
178 this.xml = xml;
179 }
180
181
182 @Override
183 public void constructModel() throws SimRuntimeException
184 {
185 this.network = new OTSRoadNetwork(getShortName(), true, getSimulator());
186 try
187 {
188 XmlNetworkLaneParser.build(new ByteArrayInputStream(this.xml.getBytes(StandardCharsets.UTF_8)), this.network,
189 false);
190 LaneCombinationList ignoreList = new LaneCombinationList();
191 try
192 {
193
194 ignoreList.addLinkCombination((CrossSectionLink) this.network.getLink("928_J5"),
195 (CrossSectionLink) this.network.getLink("928_J6"));
196 ignoreList.addLinkCombination((CrossSectionLink) this.network.getLink("925_J1"),
197 (CrossSectionLink) this.network.getLink("925_J2"));
198 }
199 catch (NullPointerException npe)
200 {
201
202 }
203 LaneCombinationList permittedList = new LaneCombinationList();
204 ConflictBuilder.buildConflicts(this.network, this.network.getGtuType(GTUType.DEFAULTS.VEHICLE), getSimulator(),
205 new ConflictBuilder.FixedWidthGenerator(Length.instantiateSI(2.0)), ignoreList, permittedList);
206 }
207 catch (NetworkException | OTSGeometryException | JAXBException | URISyntaxException | XmlParserException
208 | SAXException | ParserConfigurationException | GTUException | IOException
209 | TrafficControlException exception)
210 {
211 exception.printStackTrace();
212
213
214 throw new SimRuntimeException(exception.getMessage());
215 }
216 }
217
218
219 @Override
220 public OTSRoadNetwork getNetwork()
221 {
222 return this.network;
223 }
224
225
226 @Override
227 public Serializable getSourceId()
228 {
229 return "LoadXML.Model";
230 }
231
232 }
233
234 }