001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.io.importexport; 003 004import static org.openstreetmap.josm.tools.I18n.tr; 005 006import java.io.File; 007import java.io.FileNotFoundException; 008import java.io.IOException; 009import java.io.InputStream; 010 011import javax.swing.JOptionPane; 012 013import org.openstreetmap.josm.Main; 014import org.openstreetmap.josm.actions.ExtensionFileFilter; 015import org.openstreetmap.josm.data.osm.DataSet; 016import org.openstreetmap.josm.gui.MainApplication; 017import org.openstreetmap.josm.gui.layer.OsmDataLayer; 018import org.openstreetmap.josm.gui.progress.ProgressMonitor; 019import org.openstreetmap.josm.gui.util.GuiHelper; 020import org.openstreetmap.josm.io.Compression; 021import org.openstreetmap.josm.io.IllegalDataException; 022import org.openstreetmap.josm.io.OsmChangeReader; 023import org.openstreetmap.josm.tools.Logging; 024 025/** 026 * File importer that reads OSM change files (*.osc). 027 * @see <a href="http://wiki.openstreetmap.org/wiki/OsmChange">OsmChange</a> 028 */ 029public class OsmChangeImporter extends FileImporter { 030 031 public static final ExtensionFileFilter FILE_FILTER = ExtensionFileFilter.newFilterWithArchiveExtensions( 032 "osc", "osc", tr("OsmChange File"), true); 033 034 /** 035 * Constructs a new {@code OsmChangeImporter}. 036 */ 037 public OsmChangeImporter() { 038 super(FILE_FILTER); 039 } 040 041 public OsmChangeImporter(ExtensionFileFilter filter) { 042 super(filter); 043 } 044 045 @Override 046 public void importData(File file, ProgressMonitor progressMonitor) throws IOException, IllegalDataException { 047 try { 048 importData(Compression.getUncompressedFileInputStream(file), file, progressMonitor); 049 } catch (FileNotFoundException e) { 050 Logging.error(e); 051 throw new IOException(tr("File ''{0}'' does not exist.", file.getName()), e); 052 } 053 } 054 055 protected void importData(InputStream in, final File associatedFile, ProgressMonitor progressMonitor) throws IllegalDataException { 056 final DataSet dataSet = OsmChangeReader.parseDataSet(in, progressMonitor); 057 final OsmDataLayer layer = new OsmDataLayer(dataSet, associatedFile.getName(), associatedFile); 058 addDataLayer(dataSet, layer, associatedFile.getPath()); 059 } 060 061 protected void addDataLayer(final DataSet dataSet, final OsmDataLayer layer, final String filePath) { 062 // FIXME: remove UI stuff from IO subsystem 063 // 064 GuiHelper.runInEDT(() -> { 065 if (dataSet.allPrimitives().isEmpty()) { 066 JOptionPane.showMessageDialog( 067 Main.parent, 068 tr("No data found in file {0}.", filePath), 069 tr("Open OsmChange file"), 070 JOptionPane.INFORMATION_MESSAGE); 071 } 072 MainApplication.getLayerManager().addLayer(layer); 073 layer.onPostLoadFromFile(); 074 }); 075 } 076}