package aimax.osm.applications;
import java.io.File;
import java.io.InputStream;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import aima.gui.framework.AgentAppController;
import aima.gui.framework.AgentAppFrame;
import aima.gui.framework.SimpleAgentApp;
import aimax.osm.data.DataResource;
import aimax.osm.data.MapBuilder;
import aimax.osm.data.impl.DefaultMapBuilder;
import aimax.osm.reader.Bz2OsmReader;
import aimax.osm.reader.MapReader;
import aimax.osm.routing.agent.OsmAgentController;
import aimax.osm.routing.agent.OsmAgentFrame;
import aimax.osm.routing.agent.OsmAgentView;
import aimax.osm.routing.agent.MapAdapter;
/**
* Demonstrates, how the OSM map viewer can be integrated into a graphical
* agent application.
* @author Ruediger Lunde
*/
public class OsmAgentApp extends SimpleAgentApp {
protected static Logger LOG = Logger.getLogger("aimax.osm");
protected MapAdapter map;
/** Sets the default language (for file choosers etc.) to US. */
public OsmAgentApp() {
Locale.setDefault(Locale.US);
}
/** Reads a map from the specified stream and stores it in {@link #map}. */
public void readMap(InputStream stream) {
if (stream != null) {
MapReader mapReader = new Bz2OsmReader();
MapBuilder mapBuilder = new DefaultMapBuilder();
mapReader.readMap(stream, mapBuilder);
map = new MapAdapter(mapBuilder.buildMap());
}
else
LOG.warning("Map reading failed because input stream does not exist.");
}
/** Reads a map from the specified file and stores it in {@link #map}. */
public void readMap(File file) {
MapReader mapReader = new Bz2OsmReader();
MapBuilder mapBuilder = new DefaultMapBuilder();
mapReader.readMap(file, mapBuilder);
map = new MapAdapter(mapBuilder.buildMap());
}
/**
* Reads the default map showing the city of Ulm if no map
* has been loaded yet and calls the super class implementation.
*/
@Override
public AgentAppFrame constructApplicationFrame() {
if (map == null)
readMap(DataResource.getULMFileResource());
return super.constructApplicationFrame();
}
/** Factory method, which creates an <code>OsmAgentView</code>. */
@Override
public OsmAgentView createEnvironmentView() {
return new OsmAgentView(map.getOsmMap());
}
/** Factory method, which creates an <code>OsmAgentFrame</code>. */
@Override
public AgentAppFrame createFrame() {
return new OsmAgentFrame();
}
/** Factory method, which creates an <code>OsmAgentController</code>. */
@Override
public AgentAppController createController() {
return new OsmAgentController(map);
}
/////////////////////////////////////////////////////////////////
// starter method
/**
* Application starter.
*/
public static void main(String args[]) {
// Start with program arg -screenwidth=xx (with xx the width in cm).
Logger.getLogger("aimax.osm").setLevel(Level.FINEST);
Logger.getLogger("").getHandlers()[0].setLevel(Level.FINE);
OsmAgentApp demo = new OsmAgentApp();
// demo.readMap(new File("maps/Ulm.osm"));
demo.startApplication();
}
}