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.IOException;
008import java.io.InputStream;
009import java.util.List;
010
011import org.openstreetmap.josm.Main;
012import org.openstreetmap.josm.actions.ExtensionFileFilter;
013import org.openstreetmap.josm.data.notes.Note;
014import org.openstreetmap.josm.gui.layer.NoteLayer;
015import org.openstreetmap.josm.gui.progress.ProgressMonitor;
016import org.openstreetmap.josm.gui.util.GuiHelper;
017import org.xml.sax.SAXException;
018
019/**
020 * File importer that reads note dump files (*.osn, .osn.gz and .osn.bz2)
021 * @since 7538
022 */
023public class NoteImporter extends FileImporter {
024
025    private static final ExtensionFileFilter FILE_FILTER = ExtensionFileFilter.newFilterWithArchiveExtensions(
026            "osn", "osn", tr("Note Files"), true);
027
028    /** Create an importer for note dump files */
029    public NoteImporter() {
030        super(FILE_FILTER);
031    }
032
033    @Override
034    public void importData(final File file, ProgressMonitor progressMonitor) throws IOException {
035        if (Main.isDebugEnabled()) {
036            Main.debug("importing notes file " + file.getAbsolutePath());
037        }
038        try (InputStream is = Compression.getUncompressedFileInputStream(file)) {
039            final List<Note> fileNotes = new NoteReader(is).parse();
040
041            List<NoteLayer> noteLayers = null;
042            if (Main.map != null) {
043                noteLayers = Main.map.mapView.getLayersOfType(NoteLayer.class);
044            }
045            if (noteLayers != null && !noteLayers.isEmpty()) {
046                noteLayers.get(0).getNoteData().addNotes(fileNotes);
047            } else {
048                GuiHelper.runInEDT(new Runnable() {
049                    @Override
050                    public void run() {
051                        Main.main.addLayer(new NoteLayer(fileNotes, file.getName()));
052                    }
053                });
054            }
055        } catch (SAXException e) {
056            Main.error("error opening up notes file");
057            Main.error(e, true);
058            throw new IOException(e.getMessage(), e);
059        }
060    }
061}