/*
* Copyright (C) 2007 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: 02-Sep-2007
*/
package uk.me.parabola.mkgmap.reader.plugin;
import java.util.ArrayList;
import java.util.List;
import uk.me.parabola.mkgmap.general.LoadableMapDataSource;
import uk.me.parabola.mkgmap.reader.osm.xml.Osm5MapDataSource;
/**
* Class to find the correct map reader to use, based on the type of the file
* to be read.
*
* Allows new map readers to be registered, the map readers are in charge of
* recognising file formats that they can deal with.
*
* @author Steve Ratcliffe
*/
public class MapReader {
private static final List<Class<? extends LoadableMapDataSource>> loaders;
static {
String[] sources = {
"uk.me.parabola.mkgmap.reader.osm.bin.OsmBinMapDataSource",
"uk.me.parabola.mkgmap.reader.osm.o5m.O5mBinMapDataSource",
"uk.me.parabola.mkgmap.reader.polish.PolishMapDataSource",
"uk.me.parabola.mkgmap.reader.test.ElementTestDataSource",
// must be last as it is the default
"uk.me.parabola.mkgmap.reader.osm.xml.Osm5MapDataSource",
};
loaders = new ArrayList<Class<? extends LoadableMapDataSource>>();
for (String source : sources) {
try {
@SuppressWarnings({"unchecked"})
Class<? extends LoadableMapDataSource> c = (Class<? extends LoadableMapDataSource>) Class.forName(source);
loaders.add(c);
} catch (ClassNotFoundException e) {
// not available, try the rest
} catch (NoClassDefFoundError e) {
// not available, try the rest
}
}
}
/**
* Return a suitable map reader. The name of the resource to be read is
* passed in. This is usually a file name, but could be something else.
*
* @param name The resource name to be read.
* @return A LoadableMapDataSource that is capable of reading the resource.
*/
public static LoadableMapDataSource createMapReader(String name) {
for (Class<? extends LoadableMapDataSource> loader : loaders) {
try {
LoadableMapDataSource src = loader.newInstance();
if (name != null && src.isFileSupported(name))
return src;
} catch (InstantiationException e) {
// try the next one.
} catch (IllegalAccessException e) {
// try the next one.
} catch (NoClassDefFoundError e) {
// try the next one
}
}
// Give up and assume it is in the XML format. If it isn't we will get an
// error soon enough anyway.
return new Osm5MapDataSource();
}
}