/*
This file is part of RouteConverter.
RouteConverter is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
RouteConverter 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.
You should have received a copy of the GNU General Public License
along with RouteConverter; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Copyright (C) 2007 Christian Pesch. All Rights Reserved.
*/
package slash.navigation.base;
import slash.navigation.babel.AlanTrackLogFormat;
import slash.navigation.babel.AlanWaypointsAndRoutesFormat;
import slash.navigation.babel.CompeGPSDataRouteFormat;
import slash.navigation.babel.CompeGPSDataTrackFormat;
import slash.navigation.babel.CompeGPSDataWaypointFormat;
import slash.navigation.babel.FlightRecorderDataFormat;
import slash.navigation.babel.GarminFitFormat;
import slash.navigation.babel.GarminMapSource5Format;
import slash.navigation.babel.GarminMapSource6Format;
import slash.navigation.babel.GarminPcx5Format;
import slash.navigation.babel.GarminPoiDbFormat;
import slash.navigation.babel.GarminPoiFormat;
import slash.navigation.babel.GeoCachingFormat;
import slash.navigation.babel.HoluxM241BinaryFormat;
import slash.navigation.babel.Igo8TrackFormat;
import slash.navigation.babel.MagellanMapSendFormat;
import slash.navigation.babel.MicrosoftAutoRouteFormat;
import slash.navigation.babel.NationalGeographicTopo3Format;
import slash.navigation.babel.OziExplorerRouteFormat;
import slash.navigation.babel.OziExplorerTrackFormat;
import slash.navigation.babel.OziExplorerWaypointFormat;
import slash.navigation.babel.TomTomPoiFormat;
import slash.navigation.babel.TourExchangeFormat;
import slash.navigation.bcr.MTP0607Format;
import slash.navigation.bcr.MTP0809Format;
import slash.navigation.columbus.ColumbusGpsBinaryFormat;
import slash.navigation.columbus.ColumbusGpsProfessionalFormat;
import slash.navigation.columbus.ColumbusGpsStandardFormat;
import slash.navigation.columbus.ColumbusGpsType2Format;
import slash.navigation.columbus.GarbleColumbusGpsProfessionalFormat;
import slash.navigation.copilot.CoPilot6Format;
import slash.navigation.copilot.CoPilot7Format;
import slash.navigation.copilot.CoPilot8Format;
import slash.navigation.copilot.CoPilot9Format;
import slash.navigation.fpl.GarminFlightPlanFormat;
import slash.navigation.gopal.GoPal3RouteFormat;
import slash.navigation.gopal.GoPal5RouteFormat;
import slash.navigation.gopal.GoPal7RouteFormat;
import slash.navigation.gopal.GoPalTrackFormat;
import slash.navigation.gpx.GarbleGpx10Format;
import slash.navigation.gpx.GarbleGpx11Format;
import slash.navigation.gpx.Gpx10Format;
import slash.navigation.gpx.Gpx11Format;
import slash.navigation.itn.TomTom5RouteFormat;
import slash.navigation.itn.TomTom8RouteFormat;
import slash.navigation.itn.TomTom95RouteFormat;
import slash.navigation.klicktel.KlickTelRouteFormat;
import slash.navigation.kml.GarbleKml21Format;
import slash.navigation.kml.GarbleKml21LittleEndianFormat;
import slash.navigation.kml.GarbleKml22BetaFormat;
import slash.navigation.kml.GarbleKml22Format;
import slash.navigation.kml.GarbleKmz21Format;
import slash.navigation.kml.GarbleKmz21LittleEndianFormat;
import slash.navigation.kml.Igo8RouteFormat;
import slash.navigation.kml.Kml20Format;
import slash.navigation.kml.Kml21Format;
import slash.navigation.kml.Kml22BetaFormat;
import slash.navigation.kml.Kml22Format;
import slash.navigation.kml.Kmz20Format;
import slash.navigation.kml.Kmz21Format;
import slash.navigation.kml.Kmz22BetaFormat;
import slash.navigation.kml.Kmz22Format;
import slash.navigation.lmx.NokiaLandmarkExchangeFormat;
import slash.navigation.mm.MagicMaps2GoFormat;
import slash.navigation.mm.MagicMapsIktFormat;
import slash.navigation.mm.MagicMapsPthFormat;
import slash.navigation.nmea.GarbleNmeaFormat;
import slash.navigation.nmea.MagellanExploristFormat;
import slash.navigation.nmea.MagellanRouteFormat;
import slash.navigation.nmea.NmeaFormat;
import slash.navigation.nmn.NavigatingPoiWarnerFormat;
import slash.navigation.nmn.Nmn4Format;
import slash.navigation.nmn.Nmn5Format;
import slash.navigation.nmn.Nmn6FavoritesFormat;
import slash.navigation.nmn.Nmn6Format;
import slash.navigation.nmn.Nmn7Format;
import slash.navigation.nmn.NmnRouteFormat;
import slash.navigation.nmn.NmnUrlFormat;
import slash.navigation.ovl.OvlFormat;
import slash.navigation.photo.PhotoFormat;
import slash.navigation.simple.ApeMapFormat;
import slash.navigation.simple.GarbleHaicomLoggerFormat;
import slash.navigation.simple.GarbleNavilinkFormat;
import slash.navigation.simple.GlopusFormat;
import slash.navigation.simple.GoRiderGpsFormat;
import slash.navigation.simple.GpsTunerFormat;
import slash.navigation.simple.GroundTrackFormat;
import slash.navigation.simple.HaicomLoggerFormat;
import slash.navigation.simple.Iblue747Format;
import slash.navigation.simple.KienzleGpsFormat;
import slash.navigation.simple.KompassFormat;
import slash.navigation.simple.NavilinkFormat;
import slash.navigation.simple.OpelNaviFormat;
import slash.navigation.simple.QstarzQ1000Format;
import slash.navigation.simple.Route66Format;
import slash.navigation.simple.SygicAsciiFormat;
import slash.navigation.simple.SygicUnicodeFormat;
import slash.navigation.simple.WebPageFormat;
import slash.navigation.tcx.Tcx1Format;
import slash.navigation.tcx.Tcx2Format;
import slash.navigation.tour.TourFormat;
import slash.navigation.url.GoogleMapsUrlFormat;
import slash.navigation.url.MotoPlanerUrlFormat;
import slash.navigation.url.UrlFormat;
import slash.navigation.viamichelin.ViaMichelinFormat;
import slash.navigation.wbt.WintecWbt201Tk1Format;
import slash.navigation.wbt.WintecWbt201Tk2Format;
import slash.navigation.wbt.WintecWbt202TesFormat;
import slash.navigation.zip.ZipFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import static java.util.Arrays.asList;
import static java.util.Arrays.sort;
/**
* Managed the navigation formats.
*
* @author Christian Pesch
*/
public class NavigationFormatRegistry {
private final List<Class<? extends NavigationFormat>> formats = new ArrayList<>();
public NavigationFormatRegistry() {
// self-implemented formats
addFormat(NmeaFormat.class);
addFormat(MTP0809Format.class);
addFormat(MTP0607Format.class);
addFormat(TomTom95RouteFormat.class);
addFormat(TomTom8RouteFormat.class);
addFormat(TomTom5RouteFormat.class);
addFormat(Igo8RouteFormat.class);
addFormat(Kml22Format.class);
addFormat(Kmz22Format.class);
addFormat(Kml22BetaFormat.class);
addFormat(Kmz22BetaFormat.class);
addFormat(Kml21Format.class);
addFormat(Kmz21Format.class);
addFormat(Kml20Format.class);
addFormat(Kmz20Format.class);
addFormat(Gpx11Format.class);
addFormat(Gpx10Format.class);
addFormat(Nmn7Format.class);
addFormat(Nmn6FavoritesFormat.class);
addFormat(Nmn6Format.class);
addFormat(Nmn5Format.class);
addFormat(Nmn4Format.class);
addFormat(WebPageFormat.class);
addFormat(GpsTunerFormat.class);
addFormat(HaicomLoggerFormat.class);
addFormat(CoPilot7Format.class);
addFormat(CoPilot9Format.class);
addFormat(CoPilot8Format.class);
addFormat(CoPilot6Format.class);
addFormat(Route66Format.class);
addFormat(KompassFormat.class);
addFormat(GlopusFormat.class);
addFormat(ColumbusGpsProfessionalFormat.class);
addFormat(ColumbusGpsStandardFormat.class);
addFormat(ColumbusGpsType2Format.class);
addFormat(QstarzQ1000Format.class);
addFormat(Iblue747Format.class);
addFormat(SygicAsciiFormat.class);
addFormat(SygicUnicodeFormat.class);
addFormat(MagicMapsPthFormat.class);
addFormat(GoPal7RouteFormat.class);
addFormat(GoPal5RouteFormat.class);
addFormat(GoPal3RouteFormat.class);
addFormat(OvlFormat.class);
addFormat(TourFormat.class);
addFormat(ViaMichelinFormat.class);
addFormat(MagicMapsIktFormat.class);
addFormat(MagicMaps2GoFormat.class);
addFormat(MagellanExploristFormat.class);
addFormat(MagellanRouteFormat.class);
addFormat(Tcx2Format.class);
addFormat(Tcx1Format.class);
addFormat(NokiaLandmarkExchangeFormat.class);
addFormat(KlickTelRouteFormat.class);
addFormat(GarminFlightPlanFormat.class);
addFormat(WintecWbt201Tk1Format.class);
addFormat(WintecWbt201Tk2Format.class);
addFormat(ColumbusGpsBinaryFormat.class);
addFormat(NavilinkFormat.class);
addFormat(GoRiderGpsFormat.class);
addFormat(KienzleGpsFormat.class);
addFormat(GroundTrackFormat.class);
addFormat(OpelNaviFormat.class);
addFormat(NavigatingPoiWarnerFormat.class);
addFormat(NmnRouteFormat.class);
addFormat(ApeMapFormat.class);
addFormat(ZipFormat.class);
addFormat(PhotoFormat.class);
// GPSBabel-based formats
addFormat(GarminMapSource6Format.class);
addFormat(GarminMapSource5Format.class);
addFormat(MicrosoftAutoRouteFormat.class);
addFormat(TourExchangeFormat.class);
addFormat(NationalGeographicTopo3Format.class);
addFormat(MagellanMapSendFormat.class);
addFormat(AlanTrackLogFormat.class);
addFormat(AlanWaypointsAndRoutesFormat.class);
addFormat(OziExplorerRouteFormat.class);
addFormat(OziExplorerTrackFormat.class);
addFormat(OziExplorerWaypointFormat.class);
addFormat(CompeGPSDataRouteFormat.class);
addFormat(CompeGPSDataTrackFormat.class);
addFormat(CompeGPSDataWaypointFormat.class);
addFormat(GarminPcx5Format.class);
addFormat(GeoCachingFormat.class);
addFormat(GoPalTrackFormat.class);
addFormat(TomTomPoiFormat.class);
addFormat(HoluxM241BinaryFormat.class);
addFormat(FlightRecorderDataFormat.class);
addFormat(GarminFitFormat.class);
addFormat(WintecWbt202TesFormat.class);
addFormat(NmnUrlFormat.class);
addFormat(GoogleMapsUrlFormat.class);
addFormat(MotoPlanerUrlFormat.class);
addFormat(UrlFormat.class);
// second try for broken files
addFormat(GarbleColumbusGpsProfessionalFormat.class);
addFormat(GarbleNmeaFormat.class);
addFormat(GarbleHaicomLoggerFormat.class);
addFormat(GarbleGpx10Format.class);
addFormat(GarbleGpx11Format.class);
addFormat(GarbleKml21Format.class);
addFormat(GarbleKml21LittleEndianFormat.class);
addFormat(GarbleKmz21Format.class);
addFormat(GarbleKmz21LittleEndianFormat.class);
addFormat(GarbleKml22BetaFormat.class);
addFormat(GarbleKml22Format.class);
addFormat(GarbleNavilinkFormat.class);
// greedy BabelFormats
addFormat(GarminPoiFormat.class);
addFormat(Igo8TrackFormat.class);
addFormat(GarminPoiDbFormat.class);
}
private void addFormat(Class<? extends NavigationFormat> format) {
formats.add(format);
}
protected boolean includeReadFormat(NavigationFormat format) {
return true;
}
private List<NavigationFormat> getFormatInstances(boolean includeReadableFormats, boolean includeWritableFormats) {
List<NavigationFormat> result = new ArrayList<>();
for (Class<? extends NavigationFormat> formatClass : formats) {
try {
NavigationFormat format = formatClass.newInstance();
if (includeReadableFormats && format.isSupportsReading() && includeReadFormat(format) ||
includeWritableFormats && format.isSupportsWriting())
result.add(format);
} catch (Exception e) {
throw new IllegalArgumentException("Cannot instantiate " + formatClass, e);
}
}
return result;
}
public List<NavigationFormat> getReadFormats() {
return getFormatInstances(true, false);
}
public List<NavigationFormat> getWriteFormats() {
return getFormatInstances(false, true);
}
private List<NavigationFormat> sortByName(List<NavigationFormat> formats) {
NavigationFormat[] formatsArray = formats.toArray(new NavigationFormat[formats.size()]);
sort(formatsArray, new Comparator<NavigationFormat>() {
public int compare(NavigationFormat f1, NavigationFormat f2) {
return f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase());
}
});
return asList(formatsArray);
}
public List<NavigationFormat> getFormatsSortedByName() {
return sortByName(getFormatInstances(true, true));
}
private List<NavigationFormat> filterByGarble(List<NavigationFormat> formats) {
List<NavigationFormat> result = new ArrayList<>();
for(NavigationFormat format : formats) {
if(!(format instanceof GarbleNavigationFormat))
result.add(format);
}
return result;
}
public List<NavigationFormat> getReadFormatsSortedByName() {
return sortByName(filterByGarble(getReadFormats()));
}
public List<NavigationFormat> getWriteFormatsSortedByName() {
return sortByName(filterByGarble(getWriteFormats()));
}
public List<NavigationFormat> getWriteFormatsWithPreferredFormats(List<NavigationFormat> preferredFormats) {
List<NavigationFormat> formats = new ArrayList<>(getWriteFormatsSortedByName());
formats.removeAll(preferredFormats);
formats.addAll(0, preferredFormats);
return formats;
}
public List<NavigationFormat> getReadFormatsPreferredByExtension(String preferredExtension) {
List<NavigationFormat> preferredFormats = new ArrayList<>();
for(NavigationFormat format : getReadFormats()) {
if(format.getExtension().equals(preferredExtension))
preferredFormats.add(format);
}
List<NavigationFormat> result = new ArrayList<>(getReadFormats());
result.removeAll(preferredFormats);
result.addAll(0, preferredFormats);
return result;
}
public List<NavigationFormat> getReadFormatsWithPreferredFormat(NavigationFormat preferredFormat) {
List<NavigationFormat> formats = new ArrayList<>(getReadFormats());
if (preferredFormat != null) {
formats.remove(preferredFormat);
formats.add(0, preferredFormat);
}
return formats;
}
}