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.FileNotFoundException; 009import java.io.IOException; 010import java.io.InputStream; 011 012import javax.swing.JOptionPane; 013 014import org.openstreetmap.josm.Main; 015import org.openstreetmap.josm.actions.ExtensionFileFilter; 016import org.openstreetmap.josm.data.osm.DataSet; 017import org.openstreetmap.josm.gui.layer.OsmDataLayer; 018import org.openstreetmap.josm.gui.progress.NullProgressMonitor; 019import org.openstreetmap.josm.gui.progress.ProgressMonitor; 020import org.openstreetmap.josm.gui.util.GuiHelper; 021import org.openstreetmap.josm.tools.Utils; 022 023public class OsmImporter extends FileImporter { 024 025 public static final ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter( 026 "osm,xml", "osm", tr("OSM Server Files") + " (*.osm *.xml)"); 027 028 public static class OsmImporterData { 029 030 private OsmDataLayer layer; 031 private Runnable postLayerTask; 032 033 public OsmImporterData(OsmDataLayer layer, Runnable postLayerTask) { 034 this.layer = layer; 035 this.postLayerTask = postLayerTask; 036 } 037 038 public OsmDataLayer getLayer() { 039 return layer; 040 } 041 042 public Runnable getPostLayerTask() { 043 return postLayerTask; 044 } 045 } 046 047 public OsmImporter() { 048 super(FILE_FILTER); 049 } 050 051 public OsmImporter(ExtensionFileFilter filter) { 052 super(filter); 053 } 054 055 /** 056 * Imports OSM data from file 057 * @param file file to read data from 058 * @param progressMonitor handler for progress monitoring and canceling 059 */ 060 @Override 061 public void importData(File file, ProgressMonitor progressMonitor) throws IOException, IllegalDataException { 062 FileInputStream in = null; 063 try { 064 in = new FileInputStream(file); 065 importData(in, file, progressMonitor); 066 } catch (FileNotFoundException e) { 067 e.printStackTrace(); 068 throw new IOException(tr("File ''{0}'' does not exist.", file.getName())); 069 } finally { 070 Utils.close(in); 071 } 072 } 073 074 /** 075 * Imports OSM data from stream 076 * @param in input stream 077 * @param associatedFile filename of data 078 */ 079 protected void importData(InputStream in, final File associatedFile) throws IllegalDataException { 080 importData(in, associatedFile, NullProgressMonitor.INSTANCE); 081 } 082 083 /** 084 * Imports OSM data from stream 085 * @param in input stream 086 * @param associatedFile filename of data (layer name will be generated from name of file) 087 * @param pm handler for progress monitoring and canceling 088 */ 089 protected void importData(InputStream in, final File associatedFile, ProgressMonitor pm) throws IllegalDataException { 090 final OsmImporterData data = loadLayer(in, associatedFile, 091 associatedFile == null ? OsmDataLayer.createNewName() : associatedFile.getName(), pm); 092 093 // FIXME: remove UI stuff from IO subsystem 094 GuiHelper.runInEDT(new Runnable() { 095 @Override 096 public void run() { 097 Main.main.addLayer(data.layer); 098 data.postLayerTask.run(); 099 data.layer.onPostLoadFromFile(); 100 } 101 }); 102 } 103 104 /** 105 * Load osm data layer from InputStream. 106 * @param in input stream 107 * @param associatedFile filename of data (can be <code>null</code> if the stream does not come from a file) 108 * @param layerName name of generated layer 109 * @param progressMonitor handler for progress monitoring and canceling 110 */ 111 public OsmImporterData loadLayer(InputStream in, final File associatedFile, final String layerName, ProgressMonitor progressMonitor) throws IllegalDataException { 112 final DataSet dataSet = parseDataSet(in, progressMonitor); 113 if (dataSet == null) { 114 throw new IllegalDataException(tr("Invalid dataset")); 115 } 116 OsmDataLayer layer = createLayer(dataSet, associatedFile, layerName); 117 Runnable postLayerTask = createPostLayerTask(dataSet, associatedFile, layerName, layer); 118 return new OsmImporterData(layer, postLayerTask); 119 } 120 121 protected DataSet parseDataSet(InputStream in, ProgressMonitor progressMonitor) throws IllegalDataException { 122 return OsmReader.parseDataSet(in, progressMonitor); 123 } 124 125 protected OsmDataLayer createLayer(final DataSet dataSet, final File associatedFile, final String layerName) { 126 return new OsmDataLayer(dataSet, layerName, associatedFile); 127 } 128 129 protected Runnable createPostLayerTask(final DataSet dataSet, final File associatedFile, final String layerName, final OsmDataLayer layer) { 130 return new Runnable() { 131 @Override 132 public void run() { 133 if (dataSet.allPrimitives().isEmpty()) { 134 String msg; 135 if (associatedFile == null) { 136 msg = tr("No data found for layer ''{0}''.", layerName); 137 } else { 138 msg = tr("No data found in file ''{0}''.", associatedFile.getPath()); 139 } 140 JOptionPane.showMessageDialog( 141 Main.parent, 142 msg, 143 tr("Open OSM file"), 144 JOptionPane.INFORMATION_MESSAGE); 145 } 146 layer.onPostLoadFromFile(); 147 } 148 }; 149 } 150}