[1146] | 1 | //License: GPL. For details, see LICENSE file.
|
---|
| 2 | package org.openstreetmap.josm.io;
|
---|
| 3 |
|
---|
| 4 | import static org.openstreetmap.josm.tools.I18n.tr;
|
---|
| 5 |
|
---|
[5317] | 6 | import java.io.IOException;
|
---|
[1146] | 7 | import java.io.InputStream;
|
---|
| 8 |
|
---|
[5745] | 9 | import org.openstreetmap.josm.actions.downloadtasks.DownloadGpsTask;
|
---|
[4521] | 10 | import org.openstreetmap.josm.data.gpx.GpxData;
|
---|
[1146] | 11 | import org.openstreetmap.josm.data.osm.DataSet;
|
---|
[1811] | 12 | import org.openstreetmap.josm.gui.progress.ProgressMonitor;
|
---|
[5874] | 13 | import org.openstreetmap.josm.tools.Utils;
|
---|
[5317] | 14 | import org.xml.sax.SAXException;
|
---|
[1146] | 15 |
|
---|
[6244] | 16 | /**
|
---|
| 17 | * Read content from OSM server for a given URL
|
---|
| 18 | * @since 1146
|
---|
| 19 | */
|
---|
[1146] | 20 | public class OsmServerLocationReader extends OsmServerReader {
|
---|
[1169] | 21 |
|
---|
[5317] | 22 | protected final String url;
|
---|
[1169] | 23 |
|
---|
[6244] | 24 | /**
|
---|
| 25 | * Constructs a new {@code OsmServerLocationReader}.
|
---|
| 26 | * @param url The URL to fetch
|
---|
| 27 | */
|
---|
[1146] | 28 | public OsmServerLocationReader(String url) {
|
---|
| 29 | this.url = url;
|
---|
| 30 | }
|
---|
[1169] | 31 |
|
---|
[5317] | 32 | protected abstract class Parser<T> {
|
---|
[6244] | 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 |
|
---|
[5317] | 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 {
|
---|
[1811] | 46 | progressMonitor.beginTask(tr("Contacting Server...", 10));
|
---|
[1146] | 47 | try {
|
---|
[5317] | 48 | return parser.parse();
|
---|
[1670] | 49 | } catch(OsmTransferException e) {
|
---|
[1146] | 50 | throw e;
|
---|
| 51 | } catch (Exception e) {
|
---|
| 52 | if (cancel)
|
---|
| 53 | return null;
|
---|
[1670] | 54 | throw new OsmTransferException(e);
|
---|
[1790] | 55 | } finally {
|
---|
[1811] | 56 | progressMonitor.finishTask();
|
---|
[5874] | 57 | activeConnection = null;
|
---|
| 58 | Utils.close(parser.in);
|
---|
| 59 | parser.in = null;
|
---|
[4521] | 60 | }
|
---|
| 61 | }
|
---|
| 62 |
|
---|
[5317] | 63 | @Override
|
---|
| 64 | public DataSet parseOsm(final ProgressMonitor progressMonitor) throws OsmTransferException {
|
---|
[6244] | 65 | return doParse(new OsmParser(progressMonitor, Compression.NONE), progressMonitor);
|
---|
[5317] | 66 | }
|
---|
| 67 |
|
---|
| 68 | @Override
|
---|
| 69 | public DataSet parseOsmBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
|
---|
[6244] | 70 | return doParse(new OsmParser(progressMonitor, Compression.BZIP2), progressMonitor);
|
---|
[5317] | 71 | }
|
---|
[6070] | 72 |
|
---|
[5361] | 73 | @Override
|
---|
| 74 | public DataSet parseOsmGzip(final ProgressMonitor progressMonitor) throws OsmTransferException {
|
---|
[6244] | 75 | return doParse(new OsmParser(progressMonitor, Compression.GZIP), progressMonitor);
|
---|
[5361] | 76 | }
|
---|
[5317] | 77 |
|
---|
[4521] | 78 | @Override
|
---|
[6882] | 79 | public DataSet parseOsmZip(final ProgressMonitor progressMonitor) throws OsmTransferException {
|
---|
| 80 | return doParse(new OsmParser(progressMonitor, Compression.ZIP), progressMonitor);
|
---|
| 81 | }
|
---|
| 82 |
|
---|
| 83 | @Override
|
---|
[6244] | 84 | public DataSet parseOsmChange(final ProgressMonitor progressMonitor) throws OsmTransferException {
|
---|
| 85 | return doParse(new OsmChangeParser(progressMonitor, Compression.NONE), progressMonitor);
|
---|
[4530] | 86 | }
|
---|
[6070] | 87 |
|
---|
[5361] | 88 | @Override
|
---|
| 89 | public DataSet parseOsmChangeBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
|
---|
[6244] | 90 | return doParse(new OsmChangeParser(progressMonitor, Compression.BZIP2), progressMonitor);
|
---|
[5361] | 91 | }
|
---|
[6070] | 92 |
|
---|
[5361] | 93 | @Override
|
---|
| 94 | public DataSet parseOsmChangeGzip(final ProgressMonitor progressMonitor) throws OsmTransferException {
|
---|
[6244] | 95 | return doParse(new OsmChangeParser(progressMonitor, Compression.GZIP), progressMonitor);
|
---|
[5361] | 96 | }
|
---|
[4530] | 97 |
|
---|
| 98 | @Override
|
---|
[5317] | 99 | public GpxData parseRawGps(final ProgressMonitor progressMonitor) throws OsmTransferException {
|
---|
[6244] | 100 | return doParse(new GpxParser(progressMonitor, Compression.NONE), progressMonitor);
|
---|
[1146] | 101 | }
|
---|
[6244] | 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..."));
|
---|
[6716] | 119 | return OsmReader.parseDataSet(compression.getUncompressedInputStream(in), progressMonitor.createSubTaskMonitor(1, false));
|
---|
[6244] | 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..."));
|
---|
[6716] | 134 | return OsmChangeReader.parseDataSet(compression.getUncompressedInputStream(in), progressMonitor.createSubTaskMonitor(1, false));
|
---|
[6244] | 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 {
|
---|
[6803] | 145 | in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(1, true), null, true);
|
---|
[6244] | 146 | if (in == null)
|
---|
| 147 | return null;
|
---|
| 148 | progressMonitor.subTask(tr("Downloading OSM data..."));
|
---|
[6716] | 149 | GpxReader reader = new GpxReader(compression.getUncompressedInputStream(in));
|
---|
[6244] | 150 | gpxParsedProperly = reader.parse(false);
|
---|
| 151 | GpxData result = reader.getGpxData();
|
---|
| 152 | result.fromServer = DownloadGpsTask.isFromServer(url);
|
---|
| 153 | return result;
|
---|
| 154 | }
|
---|
| 155 | }
|
---|
[1146] | 156 | }
|
---|