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