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}