// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.opendata.core.io; import static org.openstreetmap.josm.tools.I18n.tr; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.actions.ExtensionFileFilter; import org.openstreetmap.josm.data.osm.DataSet; import org.openstreetmap.josm.gui.layer.OsmDataLayer; import org.openstreetmap.josm.gui.progress.ProgressMonitor; import org.openstreetmap.josm.io.IllegalDataException; import org.openstreetmap.josm.io.OsmImporter; import org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler; import org.openstreetmap.josm.plugins.opendata.core.datasets.DataSetUpdater; import org.openstreetmap.josm.plugins.opendata.core.layers.OdDataLayer; import org.openstreetmap.josm.plugins.opendata.core.modules.Module; import org.openstreetmap.josm.plugins.opendata.core.modules.ModuleHandler; public abstract class AbstractImporter extends OsmImporter { protected AbstractDataSetHandler handler; protected File file; public AbstractImporter(ExtensionFileFilter filter) { super(filter); } protected final AbstractDataSetHandler findDataSetHandler(File file) { for (Module module : ModuleHandler.moduleList) { for (AbstractDataSetHandler dsh : module.getNewlyInstanciatedHandlers()) { if (dsh.acceptsFile(file)) { return dsh; } } } return null; } @Override public void importData(File file, ProgressMonitor progressMonitor) throws IOException, IllegalDataException { if (file != null) { this.file = file; this.handler = findDataSetHandler(file); } // Do not call super.importData because Compression.getUncompressedFileInputStream skips the first entry try (InputStream in = new FileInputStream(file)) { importData(in, file, progressMonitor); } catch (FileNotFoundException e) { Main.error(e); throw new IOException(tr("File ''{0}'' does not exist.", file.getName()), e); } } @Override protected OsmDataLayer createLayer(DataSet dataSet, File associatedFile, String layerName) { DataSetUpdater.updateDataSet(dataSet, handler, associatedFile); return new OdDataLayer(dataSet, layerName, associatedFile, handler); } }