source: josm/trunk/src/org/openstreetmap/josm/io/AbstractParser.java@ 14397

Last change on this file since 14397 was 14214, checked in by Don-vip, 6 years ago

sonarqube - squid:S4551 - Enum values should be compared with "=="

  • Property svn:eol-style set to native
File size: 7.8 KB
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.util.Date;
7
8import org.openstreetmap.josm.data.coor.LatLon;
9import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
10import org.openstreetmap.josm.data.osm.RelationMemberData;
11import org.openstreetmap.josm.data.osm.User;
12import org.openstreetmap.josm.data.osm.history.HistoryNode;
13import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
14import org.openstreetmap.josm.data.osm.history.HistoryRelation;
15import org.openstreetmap.josm.data.osm.history.HistoryWay;
16import org.openstreetmap.josm.tools.date.DateUtils;
17import org.xml.sax.Attributes;
18import org.xml.sax.Locator;
19import org.xml.sax.SAXException;
20import org.xml.sax.helpers.DefaultHandler;
21
22/**
23 * Base class of {@link OsmChangesetContentParser} and {@link OsmHistoryReader} internal parsers.
24 * @since 6201
25 */
26public abstract class AbstractParser extends DefaultHandler {
27
28 /** the current primitive to be read */
29 protected HistoryOsmPrimitive currentPrimitive;
30 protected Locator locator;
31
32 @Override
33 public void setDocumentLocator(Locator locator) {
34 this.locator = locator;
35 }
36
37 protected abstract void throwException(String message) throws SAXException;
38
39 protected abstract void throwException(String message, Exception e) throws SAXException;
40
41 protected final long getMandatoryAttributeLong(Attributes attr, String name) throws SAXException {
42 String v = attr.getValue(name);
43 if (v == null) {
44 throwException(tr("Missing mandatory attribute ''{0}''.", name));
45 }
46 long l = 0L;
47 try {
48 l = Long.parseLong(v);
49 } catch (NumberFormatException e) {
50 throwException(tr("Illegal value for mandatory attribute ''{0}'' of type long. Got ''{1}''.", name, v), e);
51 }
52 if (l < 0) {
53 throwException(tr("Illegal value for mandatory attribute ''{0}'' of type long (>=0). Got ''{1}''.", name, v));
54 }
55 return l;
56 }
57
58 protected final Long getAttributeLong(Attributes attr, String name) throws SAXException {
59 String v = attr.getValue(name);
60 if (v == null)
61 return null;
62 Long l = 0L;
63 try {
64 l = Long.valueOf(v);
65 } catch (NumberFormatException e) {
66 throwException(tr("Illegal value for mandatory attribute ''{0}'' of type long. Got ''{1}''.", name, v), e);
67 }
68 if (l < 0) {
69 throwException(tr("Illegal value for mandatory attribute ''{0}'' of type long (>=0). Got ''{1}''.", name, v));
70 }
71 return l;
72 }
73
74 protected final Double getAttributeDouble(Attributes attr, String name) throws SAXException {
75 String v = attr.getValue(name);
76 if (v == null) {
77 return null;
78 }
79 double d = 0.0;
80 try {
81 d = Double.parseDouble(v);
82 } catch (NumberFormatException e) {
83 throwException(tr("Illegal value for attribute ''{0}'' of type double. Got ''{1}''.", name, v), e);
84 }
85 return d;
86 }
87
88 protected final String getMandatoryAttributeString(Attributes attr, String name) throws SAXException {
89 String v = attr.getValue(name);
90 if (v == null) {
91 throwException(tr("Missing mandatory attribute ''{0}''.", name));
92 }
93 return v;
94 }
95
96 protected boolean getMandatoryAttributeBoolean(Attributes attr, String name) throws SAXException {
97 String v = attr.getValue(name);
98 if (v == null) {
99 throwException(tr("Missing mandatory attribute ''{0}''.", name));
100 }
101 if ("true".equals(v)) return true;
102 if ("false".equals(v)) return false;
103 throwException(tr("Illegal value for mandatory attribute ''{0}'' of type boolean. Got ''{1}''.", name, v));
104 return false; // not reached
105 }
106
107 protected final HistoryOsmPrimitive createPrimitive(Attributes atts, OsmPrimitiveType type) throws SAXException {
108 long id = getMandatoryAttributeLong(atts, "id");
109 long version = getMandatoryAttributeLong(atts, "version");
110 Long changeset = getAttributeLong(atts, "changeset");
111 long changesetId = changeset != null ? changeset : 0L;
112 boolean visible = getMandatoryAttributeBoolean(atts, "visible");
113
114 Long uid = getAttributeLong(atts, "uid");
115 String userStr = atts.getValue("user");
116 User user;
117 if (userStr != null) {
118 if (uid != null) {
119 user = User.createOsmUser(uid, userStr);
120 user.setPreferredName(userStr);
121 } else {
122 user = User.createLocalUser(userStr);
123 }
124 } else {
125 user = User.getAnonymous();
126 }
127
128 String v = getMandatoryAttributeString(atts, "timestamp");
129 Date timestamp = DateUtils.fromString(v);
130 HistoryOsmPrimitive primitive = null;
131 if (type == OsmPrimitiveType.NODE) {
132 Double lat = getAttributeDouble(atts, "lat");
133 Double lon = getAttributeDouble(atts, "lon");
134 LatLon coor = (lat != null && lon != null) ? new LatLon(lat, lon) : null;
135 primitive = new HistoryNode(id, version, visible, user, changesetId, timestamp, coor, changeset != null);
136
137 } else if (type == OsmPrimitiveType.WAY) {
138 primitive = new HistoryWay(id, version, visible, user, changesetId, timestamp, changeset != null);
139 } else if (type == OsmPrimitiveType.RELATION) {
140 primitive = new HistoryRelation(id, version, visible, user, changesetId, timestamp, changeset != null);
141 }
142 return primitive;
143 }
144
145 protected final void startNode(Attributes atts) throws SAXException {
146 currentPrimitive = createPrimitive(atts, OsmPrimitiveType.NODE);
147 }
148
149 protected final void startWay(Attributes atts) throws SAXException {
150 currentPrimitive = createPrimitive(atts, OsmPrimitiveType.WAY);
151 }
152
153 protected final void startRelation(Attributes atts) throws SAXException {
154 currentPrimitive = createPrimitive(atts, OsmPrimitiveType.RELATION);
155 }
156
157 protected final void handleTag(Attributes atts) throws SAXException {
158 String key = getMandatoryAttributeString(atts, "k");
159 String value = getMandatoryAttributeString(atts, "v");
160 currentPrimitive.put(key, value);
161 }
162
163 protected final void handleNodeReference(Attributes atts) throws SAXException {
164 long ref = getMandatoryAttributeLong(atts, "ref");
165 ((HistoryWay) currentPrimitive).addNode(ref);
166 }
167
168 protected void handleMember(Attributes atts) throws SAXException {
169 long ref = getMandatoryAttributeLong(atts, "ref");
170 String v = getMandatoryAttributeString(atts, "type");
171 OsmPrimitiveType type = null;
172 try {
173 type = OsmPrimitiveType.fromApiTypeName(v);
174 } catch (IllegalArgumentException e) {
175 throwException(tr("Illegal value for mandatory attribute ''{0}'' of type OsmPrimitiveType. Got ''{1}''.", "type", v), e);
176 }
177 String role = getMandatoryAttributeString(atts, "role");
178 RelationMemberData member = new RelationMemberData(role, type, ref);
179 ((HistoryRelation) currentPrimitive).addMember(member);
180 }
181
182 protected final boolean doStartElement(String qName, Attributes atts) throws SAXException {
183 switch (qName) {
184 case "node":
185 startNode(atts);
186 return true;
187 case "way":
188 startWay(atts);
189 return true;
190 case "relation":
191 startRelation(atts);
192 return true;
193 case "tag":
194 handleTag(atts);
195 return true;
196 case "nd":
197 handleNodeReference(atts);
198 return true;
199 case "member":
200 handleMember(atts);
201 return true;
202 default:
203 return false;
204 }
205 }
206}
Note: See TracBrowser for help on using the repository browser.