001 //License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.io;
003
004 import static org.openstreetmap.josm.tools.I18n.tr;
005
006 import java.io.IOException;
007 import java.io.InputStream;
008 import java.util.zip.GZIPInputStream;
009
010 import org.apache.tools.bzip2.CBZip2InputStream;
011 import org.openstreetmap.josm.data.gpx.GpxData;
012 import org.openstreetmap.josm.data.osm.DataSet;
013 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
014 import org.xml.sax.SAXException;
015
016 public class OsmServerLocationReader extends OsmServerReader {
017
018 protected final String url;
019
020 public OsmServerLocationReader(String url) {
021 this.url = url;
022 }
023
024 protected abstract class Parser<T> {
025 public InputStream in = null;
026 public abstract T parse() throws OsmTransferException, IllegalDataException, IOException, SAXException;
027 }
028
029 protected final <T> T doParse(Parser<T> parser, final ProgressMonitor progressMonitor) throws OsmTransferException {
030 progressMonitor.beginTask(tr("Contacting Server...", 10));
031 try {
032 return parser.parse();
033 } catch(OsmTransferException e) {
034 throw e;
035 } catch (Exception e) {
036 if (cancel)
037 return null;
038 throw new OsmTransferException(e);
039 } finally {
040 progressMonitor.finishTask();
041 try {
042 activeConnection = null;
043 if (parser.in != null) {
044 parser.in.close();
045 parser.in = null;
046 }
047 } catch(Exception e) {/* ignore it */}
048 }
049 }
050
051 /**
052 * Method to download OSM files from somewhere
053 */
054 @Override
055 public DataSet parseOsm(final ProgressMonitor progressMonitor) throws OsmTransferException {
056 return doParse(new Parser<DataSet>() {
057 @Override
058 public DataSet parse() throws OsmTransferException, IllegalDataException {
059 in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(9, false));
060 if (in == null)
061 return null;
062 progressMonitor.subTask(tr("Downloading OSM data..."));
063 return OsmReader.parseDataSet(in, progressMonitor.createSubTaskMonitor(1, false));
064 }
065 }, progressMonitor);
066 }
067
068 /**
069 * Method to download BZip2-compressed OSM files from somewhere
070 */
071 @Override
072 public DataSet parseOsmBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
073 return doParse(new Parser<DataSet>() {
074 @Override
075 public DataSet parse() throws OsmTransferException, IllegalDataException, IOException {
076 in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(9, false));
077 if (in == null)
078 return null;
079 CBZip2InputStream bzin = FileImporter.getBZip2InputStream(in);
080 progressMonitor.subTask(tr("Downloading OSM data..."));
081 return OsmReader.parseDataSet(bzin, progressMonitor.createSubTaskMonitor(1, false));
082 }
083 }, progressMonitor);
084 }
085
086 /**
087 * Method to download GZip-compressed OSM files from somewhere
088 */
089 @Override
090 public DataSet parseOsmGzip(final ProgressMonitor progressMonitor) throws OsmTransferException {
091 return doParse(new Parser<DataSet>() {
092 @Override
093 public DataSet parse() throws OsmTransferException, IllegalDataException, IOException {
094 in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(9, false));
095 if (in == null)
096 return null;
097 GZIPInputStream gzin = FileImporter.getGZipInputStream(in);
098 progressMonitor.subTask(tr("Downloading OSM data..."));
099 return OsmReader.parseDataSet(gzin, progressMonitor.createSubTaskMonitor(1, false));
100 }
101 }, progressMonitor);
102 }
103
104 /* (non-Javadoc)
105 * @see org.openstreetmap.josm.io.OsmServerReader#parseOsmChange(org.openstreetmap.josm.gui.progress.ProgressMonitor)
106 */
107 @Override
108 public DataSet parseOsmChange(final ProgressMonitor progressMonitor)
109 throws OsmTransferException {
110 return doParse(new Parser<DataSet>() {
111 @Override
112 public DataSet parse() throws OsmTransferException, IllegalDataException {
113 in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(9, false));
114 if (in == null)
115 return null;
116 progressMonitor.subTask(tr("Downloading OSM data..."));
117 return OsmChangeReader.parseDataSet(in, progressMonitor.createSubTaskMonitor(1, false));
118 }
119 }, progressMonitor);
120 }
121
122 /**
123 * Method to download BZip2-compressed OSM Change files from somewhere
124 */
125 @Override
126 public DataSet parseOsmChangeBzip2(final ProgressMonitor progressMonitor) throws OsmTransferException {
127 return doParse(new Parser<DataSet>() {
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 CBZip2InputStream bzin = FileImporter.getBZip2InputStream(in);
134 progressMonitor.subTask(tr("Downloading OSM data..."));
135 return OsmChangeReader.parseDataSet(bzin, progressMonitor.createSubTaskMonitor(1, false));
136 }
137 }, progressMonitor);
138 }
139
140 /**
141 * Method to download GZip-compressed OSM Change files from somewhere
142 */
143 @Override
144 public DataSet parseOsmChangeGzip(final ProgressMonitor progressMonitor) throws OsmTransferException {
145 return doParse(new Parser<DataSet>() {
146 @Override
147 public DataSet parse() throws OsmTransferException, IllegalDataException, IOException {
148 in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(9, false));
149 if (in == null)
150 return null;
151 GZIPInputStream gzin = FileImporter.getGZipInputStream(in);
152 progressMonitor.subTask(tr("Downloading OSM data..."));
153 return OsmChangeReader.parseDataSet(gzin, progressMonitor.createSubTaskMonitor(1, false));
154 }
155 }, progressMonitor);
156 }
157
158 @Override
159 public GpxData parseRawGps(final ProgressMonitor progressMonitor) throws OsmTransferException {
160 return doParse(new Parser<GpxData>() {
161 @Override
162 public GpxData parse() throws OsmTransferException, IllegalDataException, IOException, SAXException {
163 in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(1, true));
164 if (in == null)
165 return null;
166 progressMonitor.subTask(tr("Downloading OSM data..."));
167 GpxReader reader = new GpxReader(in);
168 gpxParsedProperly = reader.parse(false);
169 GpxData result = reader.data;
170 result.fromServer = true;
171 return result;
172 }
173 }, progressMonitor);
174 }
175 }