source: josm/trunk/src/org/openstreetmap/josm/io/OsmServerLocationReader.java@ 6822

Last change on this file since 6822 was 6803, checked in by simon04, 10 years ago

fix #9660 - Allow to download compressed GPX tracks from osm.org/trace/ using "Download location"

This works by inspecting the filename in the Content-Disposition HTTP header.

  • Property svn:eol-style set to native
File size: 5.8 KB
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.IOException;
7import java.io.InputStream;
8
9import org.openstreetmap.josm.actions.downloadtasks.DownloadGpsTask;
10import org.openstreetmap.josm.data.gpx.GpxData;
11import org.openstreetmap.josm.data.osm.DataSet;
12import org.openstreetmap.josm.gui.progress.ProgressMonitor;
13import org.openstreetmap.josm.tools.Utils;
14import org.xml.sax.SAXException;
15
16/**
17 * Read content from OSM server for a given URL
18 * @since 1146
19 */
20public class OsmServerLocationReader extends OsmServerReader {
21
22 protected final String url;
23
24 /**
25 * Constructs a new {@code OsmServerLocationReader}.
26 * @param url The URL to fetch
27 */
28 public OsmServerLocationReader(String url) {
29 this.url = url;
30 }
31
32 protected abstract class Parser<T> {
33 protected final ProgressMonitor progressMonitor;
34 protected final Compression compression;
35 protected InputStream in = null;
36
37 public Parser(ProgressMonitor progressMonitor, Compression compression) {
38 this.progressMonitor = progressMonitor;
39 this.compression = compression;
40 }
41
42 public abstract T parse() throws OsmTransferException, IllegalDataException, IOException, SAXException;
43 }
44
45 protected final <T> T doParse(Parser<T> parser, final ProgressMonitor progressMonitor) throws OsmTransferException {
46 progressMonitor.beginTask(tr("Contacting Server...", 10));
47 try {
48 return parser.parse();
49 } catch(OsmTransferException e) {
50 throw e;
51 } catch (Exception e) {
52 if (cancel)
53 return null;
54 throw new OsmTransferException(e);
55 } finally {
56 progressMonitor.finishTask();
57 activeConnection = null;
58 Utils.close(parser.in);
59 parser.in = null;
60 }
61 }
62
63 @Override
64 public DataSet parseOsm(final ProgressMonitor progressMonitor) throws OsmTransferException {
65 return doParse(new OsmParser(progressMonitor, Compression.NONE), progressMonitor);
66 }
67
68 @Override
69 public DataSet parseOsmBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
70 return doParse(new OsmParser(progressMonitor, Compression.BZIP2), progressMonitor);
71 }
72
73 @Override
74 public DataSet parseOsmGzip(final ProgressMonitor progressMonitor) throws OsmTransferException {
75 return doParse(new OsmParser(progressMonitor, Compression.GZIP), progressMonitor);
76 }
77
78 @Override
79 public DataSet parseOsmChange(final ProgressMonitor progressMonitor) throws OsmTransferException {
80 return doParse(new OsmChangeParser(progressMonitor, Compression.NONE), progressMonitor);
81 }
82
83 @Override
84 public DataSet parseOsmChangeBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
85 return doParse(new OsmChangeParser(progressMonitor, Compression.BZIP2), progressMonitor);
86 }
87
88 @Override
89 public DataSet parseOsmChangeGzip(final ProgressMonitor progressMonitor) throws OsmTransferException {
90 return doParse(new OsmChangeParser(progressMonitor, Compression.GZIP), progressMonitor);
91 }
92
93 @Override
94 public GpxData parseRawGps(final ProgressMonitor progressMonitor) throws OsmTransferException {
95 return doParse(new GpxParser(progressMonitor, Compression.NONE), progressMonitor);
96 }
97
98 @Override
99 public GpxData parseRawGpsBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
100 return doParse(new GpxParser(progressMonitor, Compression.BZIP2), progressMonitor);
101 }
102
103 protected class OsmParser extends Parser<DataSet> {
104 protected OsmParser(ProgressMonitor progressMonitor, Compression compression) {
105 super(progressMonitor, compression);
106 }
107
108 @Override
109 public DataSet parse() throws OsmTransferException, IllegalDataException, IOException {
110 in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(9, false));
111 if (in == null)
112 return null;
113 progressMonitor.subTask(tr("Downloading OSM data..."));
114 return OsmReader.parseDataSet(compression.getUncompressedInputStream(in), progressMonitor.createSubTaskMonitor(1, false));
115 }
116 }
117
118 protected class OsmChangeParser extends Parser<DataSet> {
119 protected OsmChangeParser(ProgressMonitor progressMonitor, Compression compression) {
120 super(progressMonitor, compression);
121 }
122
123 @Override
124 public DataSet parse() throws OsmTransferException, IllegalDataException, IOException {
125 in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(9, false));
126 if (in == null)
127 return null;
128 progressMonitor.subTask(tr("Downloading OSM data..."));
129 return OsmChangeReader.parseDataSet(compression.getUncompressedInputStream(in), progressMonitor.createSubTaskMonitor(1, false));
130 }
131 }
132
133 protected class GpxParser extends Parser<GpxData> {
134 protected GpxParser(ProgressMonitor progressMonitor, Compression compression) {
135 super(progressMonitor, compression);
136 }
137
138 @Override
139 public GpxData parse() throws OsmTransferException, IllegalDataException, IOException, SAXException {
140 in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(1, true), null, true);
141 if (in == null)
142 return null;
143 progressMonitor.subTask(tr("Downloading OSM data..."));
144 GpxReader reader = new GpxReader(compression.getUncompressedInputStream(in));
145 gpxParsedProperly = reader.parse(false);
146 GpxData result = reader.getGpxData();
147 result.fromServer = DownloadGpsTask.isFromServer(url);
148 return result;
149 }
150 }
151}
Note: See TracBrowser for help on using the repository browser.