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 reader.parse(false); 169 GpxData result = reader.data; 170 result.fromServer = true; 171 return result; 172 } 173 }, progressMonitor); 174 } 175 }