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    }