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

Last change on this file since 7596 was 7531, checked in by bastiK, 10 years ago

applied #10503 - Note download code (patch by ToeBee)

  • Property svn:eol-style set to native
File size: 7.3 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.ArrayList;
9import java.util.List;
10
11import org.openstreetmap.josm.actions.downloadtasks.DownloadGpsTask;
12import org.openstreetmap.josm.data.gpx.GpxData;
13import org.openstreetmap.josm.data.notes.Note;
14import org.openstreetmap.josm.data.osm.DataSet;
15import org.openstreetmap.josm.gui.progress.ProgressMonitor;
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 protected abstract class Parser<T> {
36 protected final ProgressMonitor progressMonitor;
37 protected final Compression compression;
38 protected InputStream in = null;
39
40 public Parser(ProgressMonitor progressMonitor, Compression compression) {
41 this.progressMonitor = progressMonitor;
42 this.compression = compression;
43 }
44
45 public abstract T parse() throws OsmTransferException, IllegalDataException, IOException, SAXException;
46 }
47
48 protected final <T> T doParse(Parser<T> parser, final ProgressMonitor progressMonitor) throws OsmTransferException {
49 progressMonitor.beginTask(tr("Contacting Server...", 10));
50 try {
51 return parser.parse();
52 } catch(OsmTransferException e) {
53 throw e;
54 } catch (Exception e) {
55 if (cancel)
56 return null;
57 throw new OsmTransferException(e);
58 } finally {
59 progressMonitor.finishTask();
60 activeConnection = null;
61 Utils.close(parser.in);
62 parser.in = null;
63 }
64 }
65
66 @Override
67 public DataSet parseOsm(final ProgressMonitor progressMonitor) throws OsmTransferException {
68 return doParse(new OsmParser(progressMonitor, Compression.NONE), progressMonitor);
69 }
70
71 @Override
72 public DataSet parseOsmBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
73 return doParse(new OsmParser(progressMonitor, Compression.BZIP2), progressMonitor);
74 }
75
76 @Override
77 public DataSet parseOsmGzip(final ProgressMonitor progressMonitor) throws OsmTransferException {
78 return doParse(new OsmParser(progressMonitor, Compression.GZIP), progressMonitor);
79 }
80
81 @Override
82 public DataSet parseOsmZip(final ProgressMonitor progressMonitor) throws OsmTransferException {
83 return doParse(new OsmParser(progressMonitor, Compression.ZIP), progressMonitor);
84 }
85
86 @Override
87 public DataSet parseOsmChange(final ProgressMonitor progressMonitor) throws OsmTransferException {
88 return doParse(new OsmChangeParser(progressMonitor, Compression.NONE), progressMonitor);
89 }
90
91 @Override
92 public DataSet parseOsmChangeBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
93 return doParse(new OsmChangeParser(progressMonitor, Compression.BZIP2), progressMonitor);
94 }
95
96 @Override
97 public DataSet parseOsmChangeGzip(final ProgressMonitor progressMonitor) throws OsmTransferException {
98 return doParse(new OsmChangeParser(progressMonitor, Compression.GZIP), progressMonitor);
99 }
100
101 @Override
102 public GpxData parseRawGps(final ProgressMonitor progressMonitor) throws OsmTransferException {
103 return doParse(new GpxParser(progressMonitor, Compression.NONE), progressMonitor);
104 }
105
106 @Override
107 public GpxData parseRawGpsBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
108 return doParse(new GpxParser(progressMonitor, Compression.BZIP2), progressMonitor);
109 }
110
111 @Override
112 public List<Note> parseRawNotes(final ProgressMonitor progressMonitor) throws OsmTransferException {
113 return doParse(new NoteParser(progressMonitor, Compression.NONE), progressMonitor);
114 }
115
116 @Override
117 public List<Note> parseRawNotesBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
118 return doParse(new NoteParser(progressMonitor, Compression.BZIP2), progressMonitor);
119 }
120
121 protected class OsmParser extends Parser<DataSet> {
122 protected OsmParser(ProgressMonitor progressMonitor, Compression compression) {
123 super(progressMonitor, compression);
124 }
125
126 @Override
127 public DataSet parse() throws OsmTransferException, IllegalDataException, IOException {
128 in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(9, false));
129 if (in == null)
130 return null;
131 progressMonitor.subTask(tr("Downloading OSM data..."));
132 return OsmReader.parseDataSet(compression.getUncompressedInputStream(in), progressMonitor.createSubTaskMonitor(1, false));
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 = DownloadGpsTask.isFromServer(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 new ArrayList<Note>();
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.