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}