[8378] | 1 | // License: GPL. For details, see LICENSE file.
|
---|
[1146] | 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;
|
---|
[7531] | 8 | import java.util.ArrayList;
|
---|
| 9 | import java.util.List;
|
---|
[1146] | 10 |
|
---|
[5745] | 11 | import org.openstreetmap.josm.actions.downloadtasks.DownloadGpsTask;
|
---|
[4521] | 12 | import org.openstreetmap.josm.data.gpx.GpxData;
|
---|
[7531] | 13 | import org.openstreetmap.josm.data.notes.Note;
|
---|
[1146] | 14 | import org.openstreetmap.josm.data.osm.DataSet;
|
---|
[1811] | 15 | import org.openstreetmap.josm.gui.progress.ProgressMonitor;
|
---|
[5874] | 16 | import org.openstreetmap.josm.tools.Utils;
|
---|
[5317] | 17 | import org.xml.sax.SAXException;
|
---|
[1146] | 18 |
|
---|
[6244] | 19 | /**
|
---|
| 20 | * Read content from OSM server for a given URL
|
---|
| 21 | * @since 1146
|
---|
| 22 | */
|
---|
[1146] | 23 | public class OsmServerLocationReader extends OsmServerReader {
|
---|
[1169] | 24 |
|
---|
[5317] | 25 | protected final String url;
|
---|
[1169] | 26 |
|
---|
[6244] | 27 | /**
|
---|
| 28 | * Constructs a new {@code OsmServerLocationReader}.
|
---|
| 29 | * @param url The URL to fetch
|
---|
| 30 | */
|
---|
[1146] | 31 | public OsmServerLocationReader(String url) {
|
---|
| 32 | this.url = url;
|
---|
| 33 | }
|
---|
[1169] | 34 |
|
---|
[5317] | 35 | protected abstract class Parser<T> {
|
---|
[6244] | 36 | protected final ProgressMonitor progressMonitor;
|
---|
| 37 | protected final Compression compression;
|
---|
[8840] | 38 | protected InputStream in;
|
---|
[6244] | 39 |
|
---|
| 40 | public Parser(ProgressMonitor progressMonitor, Compression compression) {
|
---|
| 41 | this.progressMonitor = progressMonitor;
|
---|
| 42 | this.compression = compression;
|
---|
| 43 | }
|
---|
[7509] | 44 |
|
---|
[5317] | 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 {
|
---|
[1811] | 49 | progressMonitor.beginTask(tr("Contacting Server...", 10));
|
---|
[1146] | 50 | try {
|
---|
[5317] | 51 | return parser.parse();
|
---|
[8510] | 52 | } catch (OsmTransferException e) {
|
---|
[1146] | 53 | throw e;
|
---|
| 54 | } catch (Exception e) {
|
---|
| 55 | if (cancel)
|
---|
| 56 | return null;
|
---|
[1670] | 57 | throw new OsmTransferException(e);
|
---|
[1790] | 58 | } finally {
|
---|
[1811] | 59 | progressMonitor.finishTask();
|
---|
[5874] | 60 | activeConnection = null;
|
---|
| 61 | Utils.close(parser.in);
|
---|
| 62 | parser.in = null;
|
---|
[4521] | 63 | }
|
---|
| 64 | }
|
---|
| 65 |
|
---|
[5317] | 66 | @Override
|
---|
| 67 | public DataSet parseOsm(final ProgressMonitor progressMonitor) throws OsmTransferException {
|
---|
[6244] | 68 | return doParse(new OsmParser(progressMonitor, Compression.NONE), progressMonitor);
|
---|
[5317] | 69 | }
|
---|
| 70 |
|
---|
| 71 | @Override
|
---|
| 72 | public DataSet parseOsmBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
|
---|
[6244] | 73 | return doParse(new OsmParser(progressMonitor, Compression.BZIP2), progressMonitor);
|
---|
[5317] | 74 | }
|
---|
[6070] | 75 |
|
---|
[5361] | 76 | @Override
|
---|
| 77 | public DataSet parseOsmGzip(final ProgressMonitor progressMonitor) throws OsmTransferException {
|
---|
[6244] | 78 | return doParse(new OsmParser(progressMonitor, Compression.GZIP), progressMonitor);
|
---|
[5361] | 79 | }
|
---|
[5317] | 80 |
|
---|
[4521] | 81 | @Override
|
---|
[6882] | 82 | public DataSet parseOsmZip(final ProgressMonitor progressMonitor) throws OsmTransferException {
|
---|
| 83 | return doParse(new OsmParser(progressMonitor, Compression.ZIP), progressMonitor);
|
---|
| 84 | }
|
---|
| 85 |
|
---|
| 86 | @Override
|
---|
[6244] | 87 | public DataSet parseOsmChange(final ProgressMonitor progressMonitor) throws OsmTransferException {
|
---|
| 88 | return doParse(new OsmChangeParser(progressMonitor, Compression.NONE), progressMonitor);
|
---|
[4530] | 89 | }
|
---|
[6070] | 90 |
|
---|
[5361] | 91 | @Override
|
---|
| 92 | public DataSet parseOsmChangeBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
|
---|
[6244] | 93 | return doParse(new OsmChangeParser(progressMonitor, Compression.BZIP2), progressMonitor);
|
---|
[5361] | 94 | }
|
---|
[6070] | 95 |
|
---|
[5361] | 96 | @Override
|
---|
| 97 | public DataSet parseOsmChangeGzip(final ProgressMonitor progressMonitor) throws OsmTransferException {
|
---|
[6244] | 98 | return doParse(new OsmChangeParser(progressMonitor, Compression.GZIP), progressMonitor);
|
---|
[5361] | 99 | }
|
---|
[4530] | 100 |
|
---|
| 101 | @Override
|
---|
[5317] | 102 | public GpxData parseRawGps(final ProgressMonitor progressMonitor) throws OsmTransferException {
|
---|
[6244] | 103 | return doParse(new GpxParser(progressMonitor, Compression.NONE), progressMonitor);
|
---|
[1146] | 104 | }
|
---|
[6244] | 105 |
|
---|
| 106 | @Override
|
---|
| 107 | public GpxData parseRawGpsBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
|
---|
| 108 | return doParse(new GpxParser(progressMonitor, Compression.BZIP2), progressMonitor);
|
---|
| 109 | }
|
---|
| 110 |
|
---|
[7531] | 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 |
|
---|
[6244] | 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..."));
|
---|
[6716] | 132 | return OsmReader.parseDataSet(compression.getUncompressedInputStream(in), progressMonitor.createSubTaskMonitor(1, false));
|
---|
[6244] | 133 | }
|
---|
| 134 | }
|
---|
[7509] | 135 |
|
---|
[6244] | 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..."));
|
---|
[6716] | 147 | return OsmChangeReader.parseDataSet(compression.getUncompressedInputStream(in), progressMonitor.createSubTaskMonitor(1, false));
|
---|
[6244] | 148 | }
|
---|
| 149 | }
|
---|
| 150 |
|
---|
| 151 | protected class GpxParser extends Parser<GpxData> {
|
---|
| 152 | protected GpxParser(ProgressMonitor progressMonitor, Compression compression) {
|
---|
| 153 | super(progressMonitor, compression);
|
---|
| 154 | }
|
---|
[7509] | 155 |
|
---|
[6244] | 156 | @Override
|
---|
| 157 | public GpxData parse() throws OsmTransferException, IllegalDataException, IOException, SAXException {
|
---|
[6803] | 158 | in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(1, true), null, true);
|
---|
[6244] | 159 | if (in == null)
|
---|
| 160 | return null;
|
---|
| 161 | progressMonitor.subTask(tr("Downloading OSM data..."));
|
---|
[6716] | 162 | GpxReader reader = new GpxReader(compression.getUncompressedInputStream(in));
|
---|
[6244] | 163 | gpxParsedProperly = reader.parse(false);
|
---|
| 164 | GpxData result = reader.getGpxData();
|
---|
| 165 | result.fromServer = DownloadGpsTask.isFromServer(url);
|
---|
| 166 | return result;
|
---|
| 167 | }
|
---|
| 168 | }
|
---|
[7531] | 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) {
|
---|
[9070] | 180 | return new ArrayList<>();
|
---|
[7531] | 181 | }
|
---|
| 182 | progressMonitor.subTask(tr("Downloading OSM notes..."));
|
---|
| 183 | NoteReader reader = new NoteReader(compression.getUncompressedInputStream(in));
|
---|
| 184 | return reader.parse();
|
---|
| 185 | }
|
---|
| 186 | }
|
---|
[1146] | 187 | }
|
---|