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}