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

Revision 4532, 3.8 KB checked in by Don-vip, 7 months ago (diff)

see #6653 - Import <delete> primitives as deleted primitives

Line 
1package org.openstreetmap.josm.io;
2
3import static org.openstreetmap.josm.tools.I18n.tr;
4
5import java.io.InputStream;
6
7import javax.xml.stream.XMLStreamConstants;
8import javax.xml.stream.XMLStreamException;
9
10import org.openstreetmap.josm.data.osm.DataSet;
11import org.openstreetmap.josm.data.osm.OsmPrimitive;
12import org.openstreetmap.josm.gui.progress.ProgressMonitor;
13
14public class OsmChangeReader extends OsmReader {
15
16    /**
17     * constructor (for private and subclasses use only)
18     *
19     * @see #parseDataSet(InputStream, DataSet, ProgressMonitor)
20     */
21    protected OsmChangeReader() {
22    }
23   
24    /* (non-Javadoc)
25     * @see org.openstreetmap.josm.io.OsmReader#parseRoot()
26     */
27    @Override
28    protected void parseRoot() throws XMLStreamException {
29        if (parser.getLocalName().equals("osmChange")) {
30            parseOsmChange();
31        } else {
32            parseUnknown();
33        }
34    }
35
36    private void parseOsmChange() throws XMLStreamException {
37        String v = parser.getAttributeValue(null, "version");
38        if (v == null) {
39            throwException(tr("Missing mandatory attribute ''{0}''.", "version"));
40        }
41        if (!v.equals("0.6")) {
42            throwException(tr("Unsupported version: {0}", v));
43        }
44        ds.setVersion(v);
45        while (parser.hasNext()) {
46            int event = parser.next();
47            if (event == XMLStreamConstants.START_ELEMENT) {
48                if (parser.getLocalName().equals("create")) {
49                    parseCreate();
50                } else if (parser.getLocalName().equals("modify")) {
51                    parseModify();
52                } else if (parser.getLocalName().equals("delete")) {
53                    parseDelete();
54                } else {
55                    parseUnknown();
56                }
57            } else if (event == XMLStreamConstants.END_ELEMENT) {
58                return;
59            }
60        }
61    }
62
63    private void parseDelete() throws XMLStreamException {
64        parseCommon(true);
65    }
66
67    private void parseModify() throws XMLStreamException {
68        parseCommon(false);
69    }
70
71    private void parseCreate() throws XMLStreamException {
72        parseCommon(false);
73    }
74
75    private void parseCommon(boolean deletePrimitive) throws XMLStreamException {
76        while (parser.hasNext()) {
77            int event = parser.next();
78            if (event == XMLStreamConstants.START_ELEMENT) {
79                OsmPrimitive p = null;
80                if (parser.getLocalName().equals("node")) {
81                    p = parseNode();
82                } else if (parser.getLocalName().equals("way")) {
83                    p = parseWay();
84                } else if (parser.getLocalName().equals("relation")) {
85                    p = parseRelation();
86                } else {
87                    parseUnknown();
88                }
89                if (p != null && deletePrimitive) {
90                    p.setDeleted(true);
91                }
92            } else if (event == XMLStreamConstants.END_ELEMENT) {
93                return;
94            }
95        }
96    }
97   
98    /**
99     * Parse the given input source and return the dataset.
100     *
101     * @param source the source input stream. Must not be null.
102     * @param progressMonitor  the progress monitor. If null, {@see NullProgressMonitor#INSTANCE} is assumed
103     *
104     * @return the dataset with the parsed data
105     * @throws IllegalDataException thrown if the an error was found while parsing the data from the source
106     * @throws IllegalArgumentException thrown if source is null
107     */
108    public static DataSet parseDataSet(InputStream source, ProgressMonitor progressMonitor) throws IllegalDataException {
109        return new OsmChangeReader().doParseDataSet(source, progressMonitor);
110    }
111}
Note: See TracBrowser for help on using the repository browser.