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}