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

Last change on this file since 16008 was 15784, checked in by Don-vip, 4 years ago

see #18613 - rework download tasks / URL patterns

  • Property svn:eol-style set to native
File size: 7.0 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;
8import java.util.Collections;
9import java.util.List;
10
11import org.openstreetmap.josm.data.gpx.GpxData;
12import org.openstreetmap.josm.data.notes.Note;
13import org.openstreetmap.josm.data.osm.DataSet;
14import org.openstreetmap.josm.gui.progress.ProgressMonitor;
15import org.openstreetmap.josm.io.UrlPatterns.GpxUrlPattern;
16import org.openstreetmap.josm.tools.Utils;
17import org.xml.sax.SAXException;
18
19/**
20 * Read content from OSM server for a given URL
21 * @since 1146
22 */
23public class OsmServerLocationReader extends OsmServerReader {
24
25 protected final String url;
26
27 /**
28 * Constructs a new {@code OsmServerLocationReader}.
29 * @param url The URL to fetch
30 */
31 public OsmServerLocationReader(String url) {
32 this.url = url;
33 }
34
35 /**
36 * Returns the URL to fetch
37 * @return the URL to fetch
38 * @since 15247
39 */
40 public final String getUrl() {
41 return url;
42 }
43
44 protected abstract static class Parser<T> {
45 protected final ProgressMonitor progressMonitor;
46 protected final Compression compression;
47 protected InputStream in;
48
49 public Parser(ProgressMonitor progressMonitor, Compression compression) {
50 this.progressMonitor = progressMonitor;
51 this.compression = compression;
52 }
53
54 public abstract T parse() throws OsmTransferException, IllegalDataException, IOException, SAXException;
55 }
56
57 protected final <T> T doParse(Parser<T> parser, final ProgressMonitor progressMonitor) throws OsmTransferException {
58 progressMonitor.beginTask(tr("Contacting Server...", 10));
59 try { // NOPMD
60 return parser.parse();
61 } catch (OsmTransferException e) {
62 throw e;
63 } catch (IOException | SAXException | IllegalDataException e) {
64 if (cancel)
65 return null;
66 throw new OsmTransferException(e);
67 } finally {
68 progressMonitor.finishTask();
69 activeConnection = null;
70 Utils.close(parser.in);
71 parser.in = null;
72 }
73 }
74
75 @Override
76 public DataSet parseOsm(ProgressMonitor progressMonitor) throws OsmTransferException {
77 return parseOsm(progressMonitor, Compression.NONE);
78 }
79
80 @Override
81 public DataSet parseOsm(ProgressMonitor progressMonitor, Compression compression) throws OsmTransferException {
82 return doParse(new OsmParser(progressMonitor, compression), progressMonitor);
83 }
84
85 @Override
86 public DataSet parseOsmChange(ProgressMonitor progressMonitor) throws OsmTransferException {
87 return parseOsmChange(progressMonitor, Compression.NONE);
88 }
89
90 @Override
91 public DataSet parseOsmChange(ProgressMonitor progressMonitor, Compression compression) throws OsmTransferException {
92 return doParse(new OsmChangeParser(progressMonitor, compression), progressMonitor);
93 }
94
95 @Override
96 public GpxData parseRawGps(ProgressMonitor progressMonitor) throws OsmTransferException {
97 return parseRawGps(progressMonitor, Compression.NONE);
98 }
99
100 @Override
101 public GpxData parseRawGps(ProgressMonitor progressMonitor, Compression compression) throws OsmTransferException {
102 return doParse(new GpxParser(progressMonitor, compression), progressMonitor);
103 }
104
105 @Override
106 public List<Note> parseRawNotes(ProgressMonitor progressMonitor) throws OsmTransferException {
107 return parseRawNotes(progressMonitor, Compression.NONE);
108 }
109
110 @Override
111 public List<Note> parseRawNotes(ProgressMonitor progressMonitor, Compression compression) throws OsmTransferException {
112 return doParse(new NoteParser(progressMonitor, compression), progressMonitor);
113 }
114
115 protected class OsmParser extends Parser<DataSet> {
116 protected OsmParser(ProgressMonitor progressMonitor, Compression compression) {
117 super(progressMonitor, compression);
118 }
119
120 @Override
121 public DataSet parse() throws OsmTransferException, IllegalDataException, IOException {
122 in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(9, false));
123 if (in == null)
124 return null;
125 progressMonitor.subTask(tr("Downloading OSM data..."));
126 InputStream uncompressedInputStream = compression.getUncompressedInputStream(in); // NOPMD
127 ProgressMonitor subTaskMonitor = progressMonitor.createSubTaskMonitor(1, false);
128 if ("application/json".equals(contentType)) {
129 return OsmJsonReader.parseDataSet(uncompressedInputStream, subTaskMonitor);
130 } else {
131 return OsmReader.parseDataSet(uncompressedInputStream, subTaskMonitor);
132 }
133 }
134 }
135
136 protected class OsmChangeParser extends Parser<DataSet> {
137 protected OsmChangeParser(ProgressMonitor progressMonitor, Compression compression) {
138 super(progressMonitor, compression);
139 }
140
141 @Override
142 public DataSet parse() throws OsmTransferException, IllegalDataException, IOException {
143 in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(9, false));
144 if (in == null)
145 return null;
146 progressMonitor.subTask(tr("Downloading OSM data..."));
147 return OsmChangeReader.parseDataSet(compression.getUncompressedInputStream(in), progressMonitor.createSubTaskMonitor(1, false));
148 }
149 }
150
151 protected class GpxParser extends Parser<GpxData> {
152 protected GpxParser(ProgressMonitor progressMonitor, Compression compression) {
153 super(progressMonitor, compression);
154 }
155
156 @Override
157 public GpxData parse() throws OsmTransferException, IllegalDataException, IOException, SAXException {
158 in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(1, true), null, true);
159 if (in == null)
160 return null;
161 progressMonitor.subTask(tr("Downloading OSM data..."));
162 GpxReader reader = new GpxReader(compression.getUncompressedInputStream(in));
163 gpxParsedProperly = reader.parse(false);
164 GpxData result = reader.getGpxData();
165 result.fromServer = GpxUrlPattern.isGpxFromServer(url);
166 return result;
167 }
168 }
169
170 protected class NoteParser extends Parser<List<Note>> {
171
172 public NoteParser(ProgressMonitor progressMonitor, Compression compression) {
173 super(progressMonitor, compression);
174 }
175
176 @Override
177 public List<Note> parse() throws OsmTransferException, IllegalDataException, IOException, SAXException {
178 in = getInputStream(url, progressMonitor.createSubTaskMonitor(1, true));
179 if (in == null) {
180 return Collections.emptyList();
181 }
182 progressMonitor.subTask(tr("Downloading OSM notes..."));
183 NoteReader reader = new NoteReader(compression.getUncompressedInputStream(in));
184 return reader.parse();
185 }
186 }
187}
Note: See TracBrowser for help on using the repository browser.