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 NoteLayer layer = loadLayer(is, file, file.getName(), progressMonitor); 040 if (Main.map == null || !Main.map.mapView.hasLayer(layer)) { 041 GuiHelper.runInEDT(new Runnable() { 042 @Override 043 public void run() { 044 Main.main.addLayer(layer); 045 } 046 }); 047 } 048 } catch (SAXException e) { 049 Main.error("error opening up notes file"); 050 Main.error(e, true); 051 throw new IOException(e.getMessage(), e); 052 } 053 } 054 055 /** 056 * Load note layer from InputStream. 057 * @param in input stream 058 * @param associatedFile filename of data (can be <code>null</code> if the stream does not come from a file) 059 * @param layerName name of generated layer 060 * @param progressMonitor handler for progress monitoring and canceling 061 * @return note layer 062 * @throws IOException if any I/O error occurs 063 * @throws SAXException if any SAX error occurs 064 * @since 9746 065 */ 066 public NoteLayer loadLayer(InputStream in, final File associatedFile, final String layerName, ProgressMonitor progressMonitor) 067 throws SAXException, IOException { 068 final List<Note> fileNotes = new NoteReader(in).parse(); 069 List<NoteLayer> noteLayers = null; 070 if (Main.map != null) { 071 noteLayers = Main.map.mapView.getLayersOfType(NoteLayer.class); 072 } 073 final NoteLayer layer; 074 if (noteLayers != null && !noteLayers.isEmpty()) { 075 layer = noteLayers.get(0); 076 layer.getNoteData().addNotes(fileNotes); 077 } else { 078 layer = new NoteLayer(fileNotes, associatedFile != null ? associatedFile.getName() : tr("Notes")); 079 } 080 return layer; 081 } 082}