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.xml.sax.SAXException;
017
018/**
019 * File importer that reads note dump files (*.osn, .osn.gz and .osn.bz2)
020 * @since 7538
021 */
022public class NoteImporter extends FileImporter {
023
024    private static final ExtensionFileFilter FILE_FILTER = ExtensionFileFilter.newFilterWithArchiveExtensions(
025            "osn", "osn", tr("Note Files"), true);
026
027    /** Create an importer for note dump files */
028    public NoteImporter() {
029        super(FILE_FILTER);
030    }
031
032    @Override
033    public void importData(final File file, ProgressMonitor progressMonitor) throws IOException {
034        if (Main.isDebugEnabled()) {
035            Main.debug("importing notes file " + file.getAbsolutePath());
036        }
037        try (InputStream is = Compression.getUncompressedFileInputStream(file)) {
038            final NoteLayer layer = loadLayer(is, file, file.getName(), progressMonitor);
039            if (!Main.getLayerManager().containsLayer(layer)) {
040                Main.getLayerManager().addLayer(layer);
041            }
042        } catch (SAXException e) {
043            Main.error("error opening up notes file");
044            Main.error(e, true);
045            throw new IOException(e.getMessage(), e);
046        }
047    }
048
049    /**
050     * Load note layer from InputStream.
051     * @param in input stream
052     * @param associatedFile filename of data (can be <code>null</code> if the stream does not come from a file)
053     * @param layerName name of generated layer
054     * @param progressMonitor handler for progress monitoring and canceling
055     * @return note layer
056     * @throws IOException if any I/O error occurs
057     * @throws SAXException if any SAX error occurs
058     * @since 9746
059     */
060    public NoteLayer loadLayer(InputStream in, final File associatedFile, final String layerName, ProgressMonitor progressMonitor)
061            throws SAXException, IOException {
062        final List<Note> fileNotes = new NoteReader(in).parse();
063        List<NoteLayer> noteLayers = null;
064        if (Main.map != null) {
065            noteLayers = Main.getLayerManager().getLayersOfType(NoteLayer.class);
066        }
067        final NoteLayer layer;
068        if (noteLayers != null && !noteLayers.isEmpty()) {
069            layer = noteLayers.get(0);
070            layer.getNoteData().addNotes(fileNotes);
071        } else {
072            layer = new NoteLayer(fileNotes, associatedFile != null ? associatedFile.getName() : tr("Notes"));
073        }
074        return layer;
075    }
076}