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