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

Last change on this file since 6920 was 6882, checked in by Don-vip, 10 years ago

enable loading of .osm.zip files

  • Property svn:eol-style set to native
File size: 6.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;
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 parseOsmZip(final ProgressMonitor progressMonitor) throws OsmTransferException {
80 return doParse(new OsmParser(progressMonitor, Compression.ZIP), progressMonitor);
81 }
82
83 @Override
84 public DataSet parseOsmChange(final ProgressMonitor progressMonitor) throws OsmTransferException {
85 return doParse(new OsmChangeParser(progressMonitor, Compression.NONE), progressMonitor);
86 }
87
88 @Override
89 public DataSet parseOsmChangeBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
90 return doParse(new OsmChangeParser(progressMonitor, Compression.BZIP2), progressMonitor);
91 }
92
93 @Override
94 public DataSet parseOsmChangeGzip(final ProgressMonitor progressMonitor) throws OsmTransferException {
95 return doParse(new OsmChangeParser(progressMonitor, Compression.GZIP), progressMonitor);
96 }
97
98 @Override
99 public GpxData parseRawGps(final ProgressMonitor progressMonitor) throws OsmTransferException {
100 return doParse(new GpxParser(progressMonitor, Compression.NONE), progressMonitor);
101 }
102
103 @Override
104 public GpxData parseRawGpsBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
105 return doParse(new GpxParser(progressMonitor, Compression.BZIP2), progressMonitor);
106 }
107
108 protected class OsmParser extends Parser<DataSet> {
109 protected OsmParser(ProgressMonitor progressMonitor, Compression compression) {
110 super(progressMonitor, compression);
111 }
112
113 @Override
114 public DataSet parse() throws OsmTransferException, IllegalDataException, IOException {
115 in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(9, false));
116 if (in == null)
117 return null;
118 progressMonitor.subTask(tr("Downloading OSM data..."));
119 return OsmReader.parseDataSet(compression.getUncompressedInputStream(in), progressMonitor.createSubTaskMonitor(1, false));
120 }
121 }
122
123 protected class OsmChangeParser extends Parser<DataSet> {
124 protected OsmChangeParser(ProgressMonitor progressMonitor, Compression compression) {
125 super(progressMonitor, compression);
126 }
127
128 @Override
129 public DataSet parse() throws OsmTransferException, IllegalDataException, IOException {
130 in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(9, false));
131 if (in == null)
132 return null;
133 progressMonitor.subTask(tr("Downloading OSM data..."));
134 return OsmChangeReader.parseDataSet(compression.getUncompressedInputStream(in), progressMonitor.createSubTaskMonitor(1, false));
135 }
136 }
137
138 protected class GpxParser extends Parser<GpxData> {
139 protected GpxParser(ProgressMonitor progressMonitor, Compression compression) {
140 super(progressMonitor, compression);
141 }
142
143 @Override
144 public GpxData parse() throws OsmTransferException, IllegalDataException, IOException, SAXException {
145 in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(1, true), null, true);
146 if (in == null)
147 return null;
148 progressMonitor.subTask(tr("Downloading OSM data..."));
149 GpxReader reader = new GpxReader(compression.getUncompressedInputStream(in));
150 gpxParsedProperly = reader.parse(false);
151 GpxData result = reader.getGpxData();
152 result.fromServer = DownloadGpsTask.isFromServer(url);
153 return result;
154 }
155 }
156}
Note: See TracBrowser for help on using the repository browser.