source: josm/trunk/src/org/openstreetmap/josm/io/OsmImporter.java @ 5241

Revision 5205, 4.5 KB checked in by Don-vip, 3 weeks ago (diff)

fix #7641 - JOSM does not close file handle when parsing fails

  • Property svn:eol-style set to native
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.io;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.io.File;
7import java.io.FileInputStream;
8import java.io.FileNotFoundException;
9import java.io.IOException;
10import java.io.InputStream;
11
12import javax.swing.JOptionPane;
13
14import org.openstreetmap.josm.Main;
15import org.openstreetmap.josm.actions.ExtensionFileFilter;
16import org.openstreetmap.josm.data.osm.DataSet;
17import org.openstreetmap.josm.gui.layer.OsmDataLayer;
18import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
19import org.openstreetmap.josm.gui.progress.ProgressMonitor;
20import org.openstreetmap.josm.gui.util.GuiHelper;
21
22public class OsmImporter extends FileImporter {
23
24    public static class OsmImporterData {
25
26        private OsmDataLayer layer;
27        private Runnable postLayerTask;
28
29        public OsmImporterData(OsmDataLayer layer, Runnable postLayerTask) {
30            this.layer = layer;
31            this.postLayerTask = postLayerTask;
32        }
33
34        public OsmDataLayer getLayer() {
35            return layer;
36        }
37
38        public Runnable getPostLayerTask() {
39            return postLayerTask;
40        }
41    }
42
43    public OsmImporter() {
44        super(new ExtensionFileFilter("osm,xml", "osm", tr("OSM Server Files") + " (*.osm *.xml)"));
45    }
46
47    public OsmImporter(ExtensionFileFilter filter) {
48        super(filter);
49    }
50
51    @Override
52    public void importData(File file, ProgressMonitor progressMonitor) throws IOException, IllegalDataException {
53        FileInputStream in = null;
54        try {
55            in = new FileInputStream(file);
56            importData(in, file);
57        } catch (FileNotFoundException e) {
58            e.printStackTrace();
59            throw new IOException(tr("File ''{0}'' does not exist.", file.getName()));
60        } finally {
61            if (in != null) {
62                in.close();
63            }
64        }
65    }
66
67    protected void importData(InputStream in, final File associatedFile) throws IllegalDataException {
68        final OsmImporterData data = loadLayer(in, associatedFile,
69                associatedFile == null ? OsmDataLayer.createNewName() : associatedFile.getName(), NullProgressMonitor.INSTANCE);
70
71        // FIXME: remove UI stuff from IO subsystem
72        GuiHelper.runInEDT(new Runnable() {
73            @Override
74            public void run() {
75                Main.main.addLayer(data.layer);
76                data.postLayerTask.run();
77                data.layer.onPostLoadFromFile();
78            }
79        });
80    }
81
82    /**
83     * Load osm data layer from InputStream.
84     * associatedFile can be null if the stream does not come from a file.
85     */
86    public OsmImporterData loadLayer(InputStream in, final File associatedFile, final String layerName, ProgressMonitor progressMonitor) throws IllegalDataException {
87        final DataSet dataSet = parseDataSet(in, progressMonitor);
88        if (dataSet == null) {
89            throw new IllegalDataException(tr("Invalid dataset"));
90        }
91        OsmDataLayer layer = createLayer(dataSet, associatedFile, layerName);
92        Runnable postLayerTask = createPostLayerTask(dataSet, associatedFile, layerName, layer);
93        return new OsmImporterData(layer, postLayerTask);
94    }
95
96    protected DataSet parseDataSet(InputStream in, ProgressMonitor progressMonitor) throws IllegalDataException {
97        return OsmReader.parseDataSet(in, progressMonitor);
98    }
99
100    protected OsmDataLayer createLayer(final DataSet dataSet, final File associatedFile, final String layerName) {
101        return new OsmDataLayer(dataSet, layerName, associatedFile);
102    }
103
104    protected Runnable createPostLayerTask(final DataSet dataSet, final File associatedFile, final String layerName, final OsmDataLayer layer) {
105        return new Runnable() {
106            @Override
107            public void run() {
108                if (dataSet.allPrimitives().isEmpty()) {
109                    String msg;
110                    if (associatedFile == null) {
111                        msg = tr("No data found for layer ''{0}''.", layerName);
112                    } else {
113                        msg = tr("No data found in file ''{0}''.", associatedFile.getPath());
114                    }
115                    JOptionPane.showMessageDialog(
116                            Main.parent,
117                            msg,
118                            tr("Open OSM file"),
119                            JOptionPane.INFORMATION_MESSAGE);
120                }
121                layer.onPostLoadFromFile();
122            }
123        };
124    }
125}
Note: See TracBrowser for help on using the repository browser.