/**
* This software is under the
*
* GNU GENERAL PUBLIC LICENSE
* Version 2, June 1991
*
* see attached file LICENSE
*/
package de.psi.telco.sumoplayer;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
/**
* This class runs a SUMO simulated netword dumpfile.
* It needs to know of the used xumo.net.xml network file
* in order to look up the coordinates correctly.
*
* @author Michael Willigens <michael@willigens.de>
*
*/
public class SUMOPlayer extends Thread{
private String ndumpFile = "sumo.ndump.xml";
private String networkFile = "sumo.net.xml";
private double trackingPropability = 0.01;
private int jitter = 0; // in meters
private String listenerClassname = "de.psi.telco.sumoplayer.SUMOPipedLocationListener";
private SAXParser saxParser;
private SUMOSAXHandler saxHandler;
/**
* the main function to call it from command line
* @param args
*/
public static void main(String[] args) {
String nDumpFilename = "sumo.ndump.xml";
String netFilename = "sumo.net.xml";
String listenerClassname = "de.psi.telco.sumoplayer.SUMOPipedLocationListener";
double propability = 0.01;
int jitter = 0;
for (int i = 0; i<args.length;i++){
if (args[i].equals("-n") && args.length > i+1){
netFilename = args[i+1];
i++;
}
if (args[i].equals("-d") && args.length > i+1){
nDumpFilename = args[i+1];
i++;
}
if (args[i].equals("-l") && args.length > i+1){
listenerClassname = args[i+1];
i++;
}
if (args[i].equals("-e") && args.length > i+1){
propability = Double.parseDouble(args[i+1]);
i++;
}
if (args[i].equals("-j") && args.length > i+1){
jitter = Integer.parseInt(args[i+1]);
i++;
}
}
File net = new File(netFilename);
if (!net.exists()){
System.out.println("SUMO Network file does not exist! set this with \"-n sumo.net.xml\". aborting");
System.exit(1);
}
File ndump = new File(nDumpFilename);
if (!ndump.exists()){
System.out.println("SUMO ndump file does not exist! set this with \"-d sumo.ndump.xml\". aborting");
System.exit(1);
}
SUMOPlayer player = new SUMOPlayer(nDumpFilename,netFilename,propability, jitter, listenerClassname);
player.run();
}
/**
* This function initializes a SUMO player.
* It mainly reads the network file which it
* will need to perform a simualtion.
*
*/
private void init() {
SAXParserFactory saxFactory = SAXParserFactory.newInstance();
try {
saxParser = saxFactory.newSAXParser();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
saxHandler = new SUMOSAXHandler(networkFile);
saxHandler.setCar4carEquippedPropability(this.trackingPropability);
saxHandler.setJitter(jitter);
SUMOLocationListener listener = null;
try {
listener = (SUMOLocationListener) Class.forName(listenerClassname).newInstance();
} catch (Exception e){
e.printStackTrace();
System.exit(1);
}
saxHandler.setListener(listener);
}
/**
* This function Runs the simulation.
*
*/
public void run() {
this.init(); // read network first
//System.out.println("Performing Simulation...");
try {
saxParser.parse(new File(ndumpFile), saxHandler);
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//System.out.println("done.");
}
/**
* This constructor creates a SUMO player using a ndump file.
* @param ndumpFile
* @param networkFile
* @param trackingPropability
*/
public SUMOPlayer(String ndumpFile, String networkFile, double trackingPropability, int jitter, String listenerClassname){
this.ndumpFile = ndumpFile;
this.networkFile = networkFile;
if (trackingPropability > 0) this.trackingPropability = trackingPropability;
this.jitter = jitter;
if (listenerClassname != null && listenerClassname.length() > 0){
this.listenerClassname = listenerClassname;
}
}
}