source: josm/trunk/src/org/openstreetmap/josm/io/OsmServerObjectReader.java @ 5241

Revision 4734, 5.9 KB checked in by Don-vip, 5 months ago (diff)

fix #7194 - Reworking of osmChange downloads (Fail to update a way loaded from osmChange that have been deleted after)

  • Property svn:eol-style set to native
Line 
1//License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.io;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.io.IOException;
7import java.io.InputStream;
8import java.text.MessageFormat;
9
10import org.openstreetmap.josm.data.osm.DataSet;
11import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
12import org.openstreetmap.josm.data.osm.PrimitiveId;
13import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
14import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
15import org.openstreetmap.josm.gui.progress.ProgressMonitor;
16import org.openstreetmap.josm.tools.CheckParameterUtil;
17import org.xml.sax.SAXException;
18
19/**
20 * OsmServerObjectReader reads an individual object from the OSM server.
21 *
22 * It can either download the object including or not including its immediate children.
23 * The former case is called a "full download".
24 *
25 * It can also download a specific version of the object (however, "full" download is not possible
26 * in that case).
27 *
28 */
29public class OsmServerObjectReader extends OsmServerReader {
30    /** the id of the object to download */
31    private PrimitiveId id;
32    /** true if a full download is required, i.e. a download including the immediate children */
33    private boolean full;
34    /** the specific version number, if required (incompatible with full), or -1 else */
35    private int version;
36
37    /**
38     * Creates a new server object reader for a given id and a primitive type.
39     *
40     * @param id the object id. > 0 required.
41     * @param type the type. Must not be null.
42     * @param full true, if a full download is requested (i.e. a download including
43     * immediate children); false, otherwise
44     * @throws IllegalArgumentException thrown if id <= 0
45     * @throws IllegalArgumentException thrown if type is null
46     */
47    public OsmServerObjectReader(long id, OsmPrimitiveType type, boolean full) throws IllegalArgumentException {
48        this(id, type, full, -1);
49    }
50
51    /**
52     * Creates a new server object reader for a given id and a primitive type.
53     *
54     * @param id the object id. > 0 required.
55     * @param type the type. Must not be null.
56     * @param version the specific version number, if required; -1, otherwise
57     * @throws IllegalArgumentException thrown if id <= 0
58     * @throws IllegalArgumentException thrown if type is null
59     */
60    public OsmServerObjectReader(long id, OsmPrimitiveType type, int version) throws IllegalArgumentException {
61        this(id, type, false, version);
62    }
63
64    protected OsmServerObjectReader(long id, OsmPrimitiveType type, boolean full, int version) throws IllegalArgumentException {
65        if (id <= 0)
66            throw new IllegalArgumentException(MessageFormat.format("Expected value > 0 for parameter ''{0}'', got {1}", "id", id));
67        CheckParameterUtil.ensureParameterNotNull(type, "type");
68        this.id = new SimplePrimitiveId(id, type);
69        this.full = full;
70        this.version = version;
71    }
72
73    /**
74     * Creates a new server object reader for an object with the given <code>id</code>
75     *
76     * @param id the object id. Must not be null. Unique id > 0 required.
77     * @param full true, if a full download is requested (i.e. a download including
78     * immediate children); false, otherwise
79     * @throws IllegalArgumentException thrown if id is null
80     * @throws IllegalArgumentException thrown if id.getUniqueId() <= 0
81     */
82    public OsmServerObjectReader(PrimitiveId id, boolean full) {
83        this(id, full, -1);
84    }
85
86    /**
87     * Creates a new server object reader for an object with the given <code>id</code>
88     *
89     * @param id the object id. Must not be null. Unique id > 0 required.
90     * @param version the specific version number, if required; -1, otherwise
91     * @throws IllegalArgumentException thrown if id is null
92     * @throws IllegalArgumentException thrown if id.getUniqueId() <= 0
93     */
94    public OsmServerObjectReader(PrimitiveId id, int version) {
95        this(id, false, version);
96    }
97
98    protected OsmServerObjectReader(PrimitiveId id, boolean full, int version) {
99        CheckParameterUtil.ensureValidPrimitiveId(id, "id");
100        this.id = id;
101        this.full = full;
102        this.version = version;
103    }
104
105    /**
106     * Downloads and parses the data.
107     *
108     * @param progressMonitor the progress monitor. Set to {@see NullProgressMonitor#INSTANCE} if
109     * null
110     * @return the downloaded data
111     * @throws SAXException
112     * @throws IOException
113     */
114    @Override
115    public DataSet parseOsm(ProgressMonitor progressMonitor) throws OsmTransferException {
116        if (progressMonitor == null) {
117            progressMonitor = NullProgressMonitor.INSTANCE;
118        }
119        progressMonitor.beginTask("", 1);
120        InputStream in = null;
121        try {
122            progressMonitor.indeterminateSubTask(tr("Downloading OSM data..."));
123            StringBuffer sb = new StringBuffer();
124            sb.append(id.getType().getAPIName());
125            sb.append("/");
126            sb.append(id.getUniqueId());
127            if (full && ! id.getType().equals(OsmPrimitiveType.NODE)) {
128                sb.append("/full");
129            } else if (version > 0) {
130                sb.append("/"+version);
131            }
132
133            in = getInputStream(sb.toString(), progressMonitor.createSubTaskMonitor(1, true));
134            if (in == null)
135                return null;
136            final DataSet data = OsmReader.parseDataSet(in, progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
137            return data;
138        } catch(OsmTransferException e) {
139            if (cancel) return null;
140            throw e;
141        } catch (Exception e) {
142            if (cancel) return null;
143            throw new OsmTransferException(e);
144        } finally {
145            progressMonitor.finishTask();
146            if (in!=null) {
147                try {
148                    in.close();
149                } catch(Exception e) {/* ignore this exception */}
150            }
151            activeConnection = null;
152        }
153    }
154}
Note: See TracBrowser for help on using the repository browser.