001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.io; 003 004 import static org.openstreetmap.josm.tools.I18n.tr; 005 006 import java.io.File; 007 import java.io.FileInputStream; 008 import java.io.FileNotFoundException; 009 import java.io.IOException; 010 import java.io.InputStream; 011 012 import javax.swing.JOptionPane; 013 014 import org.openstreetmap.josm.Main; 015 import org.openstreetmap.josm.actions.ExtensionFileFilter; 016 import org.openstreetmap.josm.data.osm.DataSet; 017 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 018 import org.openstreetmap.josm.gui.progress.NullProgressMonitor; 019 import org.openstreetmap.josm.gui.progress.ProgressMonitor; 020 import org.openstreetmap.josm.gui.util.GuiHelper; 021 022 public 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); 041 } else if (file.getName().endsWith(".gz")) { 042 importData(getGZipInputStream(in), file); 043 } else { 044 importData(getBZip2InputStream(in), file); 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 final DataSet dataSet = OsmChangeReader.parseDataSet(in, NullProgressMonitor.INSTANCE); 055 final OsmDataLayer layer = new OsmDataLayer(dataSet, associatedFile.getName(), associatedFile); 056 addDataLayer(dataSet, layer, associatedFile.getPath()); 057 } 058 059 protected void addDataLayer(final DataSet dataSet, final OsmDataLayer layer, final String filePath) { 060 // FIXME: remove UI stuff from IO subsystem 061 // 062 GuiHelper.runInEDT(new Runnable() { 063 @Override 064 public void run() { 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 Main.main.addLayer(layer); 073 layer.onPostLoadFromFile(); 074 } 075 }); 076 } 077 }