package de.fub.agg2graph.gpseval.data.file; import java.nio.file.Path; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; /** * TrackFileFactory is used to generate TrackFile-instances based on the files * extension. * * <p> * You can register your own TrackFile-class for a file extension (see * {@link de.fub.agg2graph.gpseval.data.file.TrackFileFactory#registerGPSDataFileClass(java.lang.String, java.lang.Class) * registerGPSDataFileClass}). * </p> * * @see */ public class TrackFileFactory { private static TrackFileFactory instance = new TrackFileFactory(); private Map<String, Class<? extends TrackFile>> mGPSDataFileClasses = new HashMap<>(); private TrackFileFactory() { registerBuiltInGPSDataFiles(); } /** * Register the built-in TrackFile-classes. */ private void registerBuiltInGPSDataFiles() { registerGPSDataFileClass(".csv", MyTracksCSVFile.class); } /** * Returns the TrackFileFactory-instance. * * @return */ public static TrackFileFactory getFactory() { return instance; } /** * Register a TrackFile-class for the specified file extension. * * @param extension * @param gpsDataFileClass */ public void registerGPSDataFileClass(String extension, Class<? extends TrackFile> gpsDataFileClass) { mGPSDataFileClasses.put(extension, gpsDataFileClass); } /** * Get the TrackFile-class used for the specified file extension. * * @param extension * @return */ public Class<? extends TrackFile> getGPSDataFileClass(String extension) { return mGPSDataFileClasses.get(extension); } /** * Create a TrackFile-instance for the file specified by the path. * * @param file * @return */ public TrackFile newGPSDataFile(Path file) { String filename = file.getFileName().toString(); String extension = filename.substring(filename.lastIndexOf('.')); TrackFile gpsDataFile = null; Class<? extends TrackFile> gpsDataFileClass = mGPSDataFileClasses .get(extension); if (gpsDataFileClass != null) { try { gpsDataFile = gpsDataFileClass.newInstance(); gpsDataFile.setDataFile(file); } catch (InstantiationException | IllegalAccessException ex) { Logger.getLogger(TrackFileFactory.class.getName()).log( Level.SEVERE, null, ex); } } return gpsDataFile; } }