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

Last change on this file since 6388 was 6244, checked in by Don-vip, 11 years ago

fix #9091 - rework osm/gpx download tasks - take into account recent changes from OSM server:

  • new hashtag scheme
  • GPX traces now returned as Bzip2-compressed files
  • Property svn:eol-style set to native
File size: 6.1 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 protected final InputStream getUncompressedInputStream() throws IOException {
43 switch (compression) {
44 case BZIP2: return FileImporter.getBZip2InputStream(in);
45 case GZIP: return FileImporter.getGZipInputStream(in);
46 case NONE:
47 default: return in;
48 }
49 }
50
51 public abstract T parse() throws OsmTransferException, IllegalDataException, IOException, SAXException;
52 }
53
54 protected final <T> T doParse(Parser<T> parser, final ProgressMonitor progressMonitor) throws OsmTransferException {
55 progressMonitor.beginTask(tr("Contacting Server...", 10));
56 try {
57 return parser.parse();
58 } catch(OsmTransferException e) {
59 throw e;
60 } catch (Exception e) {
61 if (cancel)
62 return null;
63 throw new OsmTransferException(e);
64 } finally {
65 progressMonitor.finishTask();
66 activeConnection = null;
67 Utils.close(parser.in);
68 parser.in = null;
69 }
70 }
71
72 @Override
73 public DataSet parseOsm(final ProgressMonitor progressMonitor) throws OsmTransferException {
74 return doParse(new OsmParser(progressMonitor, Compression.NONE), progressMonitor);
75 }
76
77 @Override
78 public DataSet parseOsmBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
79 return doParse(new OsmParser(progressMonitor, Compression.BZIP2), progressMonitor);
80 }
81
82 @Override
83 public DataSet parseOsmGzip(final ProgressMonitor progressMonitor) throws OsmTransferException {
84 return doParse(new OsmParser(progressMonitor, Compression.GZIP), progressMonitor);
85 }
86
87 @Override
88 public DataSet parseOsmChange(final ProgressMonitor progressMonitor) throws OsmTransferException {
89 return doParse(new OsmChangeParser(progressMonitor, Compression.NONE), progressMonitor);
90 }
91
92 @Override
93 public DataSet parseOsmChangeBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
94 return doParse(new OsmChangeParser(progressMonitor, Compression.BZIP2), progressMonitor);
95 }
96
97 @Override
98 public DataSet parseOsmChangeGzip(final ProgressMonitor progressMonitor) throws OsmTransferException {
99 return doParse(new OsmChangeParser(progressMonitor, Compression.GZIP), progressMonitor);
100 }
101
102 @Override
103 public GpxData parseRawGps(final ProgressMonitor progressMonitor) throws OsmTransferException {
104 return doParse(new GpxParser(progressMonitor, Compression.NONE), progressMonitor);
105 }
106
107 @Override
108 public GpxData parseRawGpsBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
109 return doParse(new GpxParser(progressMonitor, Compression.BZIP2), progressMonitor);
110 }
111
112 protected class OsmParser extends Parser<DataSet> {
113 protected OsmParser(ProgressMonitor progressMonitor, Compression compression) {
114 super(progressMonitor, compression);
115 }
116
117 @Override
118 public DataSet parse() throws OsmTransferException, IllegalDataException, IOException {
119 in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(9, false));
120 if (in == null)
121 return null;
122 progressMonitor.subTask(tr("Downloading OSM data..."));
123 return OsmReader.parseDataSet(getUncompressedInputStream(), progressMonitor.createSubTaskMonitor(1, false));
124 }
125 }
126
127 protected class OsmChangeParser extends Parser<DataSet> {
128 protected OsmChangeParser(ProgressMonitor progressMonitor, Compression compression) {
129 super(progressMonitor, compression);
130 }
131
132 @Override
133 public DataSet parse() throws OsmTransferException, IllegalDataException, IOException {
134 in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(9, false));
135 if (in == null)
136 return null;
137 progressMonitor.subTask(tr("Downloading OSM data..."));
138 return OsmChangeReader.parseDataSet(getUncompressedInputStream(), progressMonitor.createSubTaskMonitor(1, false));
139 }
140 }
141
142 protected class GpxParser extends Parser<GpxData> {
143 protected GpxParser(ProgressMonitor progressMonitor, Compression compression) {
144 super(progressMonitor, compression);
145 }
146
147 @Override
148 public GpxData parse() throws OsmTransferException, IllegalDataException, IOException, SAXException {
149 in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(1, true));
150 if (in == null)
151 return null;
152 progressMonitor.subTask(tr("Downloading OSM data..."));
153 GpxReader reader = new GpxReader(getUncompressedInputStream());
154 gpxParsedProperly = reader.parse(false);
155 GpxData result = reader.getGpxData();
156 result.fromServer = DownloadGpsTask.isFromServer(url);
157 return result;
158 }
159 }
160}
Note: See TracBrowser for help on using the repository browser.