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.InputStream; 007 import java.text.MessageFormat; 008 009 import org.openstreetmap.josm.data.osm.DataSet; 010 import org.openstreetmap.josm.data.osm.OsmPrimitiveType; 011 import org.openstreetmap.josm.data.osm.history.HistoryDataSet; 012 import org.openstreetmap.josm.gui.progress.ProgressMonitor; 013 import org.openstreetmap.josm.tools.CheckParameterUtil; 014 015 /** 016 * Reads the history of an {@link OsmPrimitive} from the OSM API server. 017 * 018 */ 019 public class OsmServerHistoryReader extends OsmServerReader { 020 021 private OsmPrimitiveType primitiveType; 022 private long id; 023 024 /** 025 * constructor 026 * 027 * @param type the type of the primitive whose history is to be fetched from the server. 028 * Must not be null. 029 * @param id the id of the primitive 030 * 031 * @exception IllegalArgumentException thrown, if type is null 032 */ 033 public OsmServerHistoryReader(OsmPrimitiveType type, long id) throws IllegalArgumentException { 034 CheckParameterUtil.ensureParameterNotNull(type, "type"); 035 if (id < 0) 036 throw new IllegalArgumentException(MessageFormat.format("Parameter ''{0}'' >= 0 expected. Got ''{1}''.", "id", id)); 037 this.primitiveType = type; 038 this.id = id; 039 } 040 041 /** 042 * don't use - not implemented! 043 * 044 */ 045 @Override 046 public DataSet parseOsm(ProgressMonitor progressMonitor) throws OsmTransferException { 047 return null; 048 } 049 050 /** 051 * Fetches the history from the OSM API and parses it 052 * 053 * @return the data set with the parsed history data 054 * @throws OsmTransferException thrown, if an exception occurs 055 */ 056 public HistoryDataSet parseHistory(ProgressMonitor progressMonitor) throws OsmTransferException { 057 InputStream in = null; 058 progressMonitor.beginTask(""); 059 try { 060 progressMonitor.indeterminateSubTask(tr("Contacting OSM Server...")); 061 StringBuffer sb = new StringBuffer(); 062 sb.append(primitiveType.getAPIName()) 063 .append("/").append(id).append("/history"); 064 065 in = getInputStream(sb.toString(), progressMonitor.createSubTaskMonitor(1, true)); 066 if (in == null) 067 return null; 068 progressMonitor.indeterminateSubTask(tr("Downloading history...")); 069 final OsmHistoryReader reader = new OsmHistoryReader(in); 070 HistoryDataSet data = reader.parse(progressMonitor.createSubTaskMonitor(1, true)); 071 return data; 072 } catch(OsmTransferException e) { 073 throw e; 074 } catch (Exception e) { 075 if (cancel) 076 return null; 077 throw new OsmTransferException(e); 078 } finally { 079 progressMonitor.finishTask(); 080 if (in != null) { 081 try { 082 in.close(); 083 } catch(Exception e) {} 084 activeConnection = null; 085 } 086 } 087 } 088 }