/*
* Copyright (C) 2006 Steve Ratcliffe
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*
* Author: Steve Ratcliffe
* Create date: 16-Dec-2006
*/
package uk.me.parabola.mkgmap.main;
import java.io.File;
import java.io.FileNotFoundException;
import uk.me.parabola.imgfmt.FileExistsException;
import uk.me.parabola.imgfmt.FileNotWritableException;
import uk.me.parabola.imgfmt.FileSystemParam;
import uk.me.parabola.imgfmt.FormatException;
import uk.me.parabola.imgfmt.MapFailedException;
import uk.me.parabola.imgfmt.app.map.Map;
import uk.me.parabola.imgfmt.app.srt.Sort;
import uk.me.parabola.log.Logger;
import uk.me.parabola.mkgmap.CommandArgs;
import uk.me.parabola.mkgmap.build.MapBuilder;
import uk.me.parabola.mkgmap.combiners.OverviewBuilder;
import uk.me.parabola.mkgmap.general.LoadableMapDataSource;
import uk.me.parabola.mkgmap.reader.plugin.MapReader;
/**
* Main routine for the command line map-making utility.
*
* @author Steve Ratcliffe
*/
public class MapMaker implements MapProcessor {
private static final Logger log = Logger.getLogger(MapMaker.class);
private Sort sort;
private final boolean createOverviewFiles;
public MapMaker(boolean createOverviewFiles) {
this.createOverviewFiles = createOverviewFiles;
}
public String makeMap(CommandArgs args, String filename) {
try {
LoadableMapDataSource src = loadFromFile(args, filename);
sort = args.getSort();
if (createOverviewFiles){
if (src.overviewMapLevels() != null){
makeMap(args, src, OverviewBuilder.OVERVIEW_PREFIX);
} else {
String fname = OverviewBuilder.getOverviewImgName(args.getMapname());
File f = new File(fname);
if (f.exists()) {
if (f.isFile() )
f.delete();
else {
// TODO: error message ?
}
}
}
}
return makeMap(args, src, "");
} catch (FormatException e) {
System.err.println("Bad file format: " + filename);
System.err.println(e.getMessage());
return filename;
} catch (FileNotFoundException e) {
System.err.println("Could not open file: " + filename);
return filename;
}
}
/**
* Make a map from the given map data source.
*
* @param args User supplied arguments.
* @param src The data source to load.
* @param mapNameExt
* @return The output filename for the map.
*/
private String makeMap(CommandArgs args, LoadableMapDataSource src, String mapNamePrefix) {
if (src.getBounds().isEmpty())
return null;
FileSystemParam params = new FileSystemParam();
params.setBlockSize(args.getBlockSize());
params.setMapDescription(args.getDescription());
log.info("Started making", args.getMapname(), "(" + args.getDescription() + ")");
try {
Map map = Map.createMap(mapNamePrefix + args.getMapname(), args.getOutputDir(), params, args.getMapname(), sort);
setOptions(map, args);
MapBuilder builder = new MapBuilder();
builder.config(args.getProperties());
if(! OverviewBuilder.OVERVIEW_PREFIX.equals(mapNamePrefix)){
if (args.getProperties().containsKey("route") || args.getProperties().containsKey("net"))
builder.setDoRoads(true);
}
builder.makeMap(map, src);
// Collect information on map complete.
String outName = map.getFilename();
log.info("finished making map", outName, "closing");
map.close();
return outName;
} catch (FileExistsException e) {
throw new MapFailedException("File exists already", e);
} catch (FileNotWritableException e) {
throw new MapFailedException("Could not create or write to file", e);
}
}
/**
* Set options from the command line.
*
* @param map The map to modify.
* @param args The command line arguments.
*/
private void setOptions(Map map, CommandArgs args) {
map.config(args.getProperties());
String s = args.getCharset();
if (s != null)
map.setLabelCharset(s, args.isForceUpper());
Sort sort = args.getSort();
map.setSort(sort);
}
/**
* Load up from the file. It is not necessary for the map reader to completely
* read the whole file in at once, it could pull in map-features as needed.
*
* @param args The user supplied parameters.
* @param name The filename or resource name to be read.
* @return A LoadableMapDataSource that will be used to construct the map.
* @throws FileNotFoundException For non existing files.
* @throws FormatException When the file format is not valid.
*/
private LoadableMapDataSource loadFromFile(CommandArgs args, String name) throws
FileNotFoundException, FormatException
{
LoadableMapDataSource src = MapReader.createMapReader(name);
src.config(args.getProperties());
log.info("Started loading", name);
src.load(name);
log.info("Finished loading", name);
return src;
}
}