001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.io; 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.layer.OsmDataLayer; 017import org.openstreetmap.josm.gui.progress.NullProgressMonitor; 018import org.openstreetmap.josm.gui.progress.ProgressMonitor; 019import org.openstreetmap.josm.gui.util.GuiHelper; 020 021public class OsmChangeImporter extends FileImporter { 022 023 public static final ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter( 024 "osc,osc.bz2,osc.bz,osc.gz", "osc", tr("OsmChange File") + " (*.osc *.osc.bz2 *.osc.bz *.osc.gz)"); 025 026 /** 027 * Constructs a new {@code OsmChangeImporter}. 028 */ 029 public OsmChangeImporter() { 030 super(FILE_FILTER); 031 } 032 033 public OsmChangeImporter(ExtensionFileFilter filter) { 034 super(filter); 035 } 036 037 @Override public void importData(File file, ProgressMonitor progressMonitor) throws IOException, IllegalDataException { 038 try { 039 importData(Compression.getUncompressedFileInputStream(file), file, progressMonitor); 040 } catch (FileNotFoundException e) { 041 Main.error(e); 042 throw new IOException(tr("File ''{0}'' does not exist.", file.getName())); 043 } 044 } 045 046 protected void importData(InputStream in, final File associatedFile) throws IllegalDataException { 047 importData(in, associatedFile, NullProgressMonitor.INSTANCE); 048 } 049 050 protected void importData(InputStream in, final File associatedFile, ProgressMonitor progressMonitor) throws IllegalDataException { 051 final DataSet dataSet = OsmChangeReader.parseDataSet(in, progressMonitor); 052 final OsmDataLayer layer = new OsmDataLayer(dataSet, associatedFile.getName(), associatedFile); 053 addDataLayer(dataSet, layer, associatedFile.getPath()); 054 } 055 056 protected void addDataLayer(final DataSet dataSet, final OsmDataLayer layer, final String filePath) { 057 // FIXME: remove UI stuff from IO subsystem 058 // 059 GuiHelper.runInEDT(new Runnable() { 060 @Override 061 public void run() { 062 if (dataSet.allPrimitives().isEmpty()) { 063 JOptionPane.showMessageDialog( 064 Main.parent, 065 tr("No data found in file {0}.", filePath), 066 tr("Open OsmChange file"), 067 JOptionPane.INFORMATION_MESSAGE); 068 } 069 Main.main.addLayer(layer); 070 layer.onPostLoadFromFile(); 071 } 072 }); 073 } 074}