- Timestamp:
- 2010-05-09T15:27:32+02:00 (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/io/OsmReader.java
r3217 r3226 44 44 import org.xml.sax.Locator; 45 45 import org.xml.sax.SAXException; 46 import org.xml.sax.SAXParseException; 46 47 import org.xml.sax.helpers.DefaultHandler; 47 48 … … 134 135 @Override public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { 135 136 136 if (qName.equals("osm")) { 137 if (atts == null) { 138 throwException(tr("Missing mandatory attribute ''{0}'' of XML element {1}.", "version", "osm")); 139 } 140 String v = atts.getValue("version"); 141 if (v == null) { 142 throwException(tr("Missing mandatory attribute ''{0}''.", "version")); 143 } 144 if (!(v.equals("0.5") || v.equals("0.6"))) { 145 throwException(tr("Unsupported version: {0}", v)); 146 } 147 // save generator attribute for later use when creating DataSource objects 148 generator = atts.getValue("generator"); 149 ds.setVersion(v); 150 151 } else if (qName.equals("bounds")) { 152 // new style bounds. 153 String minlon = atts.getValue("minlon"); 154 String minlat = atts.getValue("minlat"); 155 String maxlon = atts.getValue("maxlon"); 156 String maxlat = atts.getValue("maxlat"); 157 String origin = atts.getValue("origin"); 158 if (minlon != null && maxlon != null && minlat != null && maxlat != null) { 159 if (origin == null) { 160 origin = generator; 161 } 162 Bounds bounds = new Bounds( 163 new LatLon(Double.parseDouble(minlat), Double.parseDouble(minlon)), 164 new LatLon(Double.parseDouble(maxlat), Double.parseDouble(maxlon))); 165 DataSource src = new DataSource(bounds, origin); 166 ds.dataSources.add(src); 137 try { 138 if (qName.equals("osm")) { 139 if (atts == null) { 140 throwException(tr("Missing mandatory attribute ''{0}'' of XML element {1}.", "version", "osm")); 141 } 142 String v = atts.getValue("version"); 143 if (v == null) { 144 throwException(tr("Missing mandatory attribute ''{0}''.", "version")); 145 } 146 if (!(v.equals("0.5") || v.equals("0.6"))) { 147 throwException(tr("Unsupported version: {0}", v)); 148 } 149 // save generator attribute for later use when creating DataSource objects 150 generator = atts.getValue("generator"); 151 ds.setVersion(v); 152 153 } else if (qName.equals("bounds")) { 154 // new style bounds. 155 String minlon = atts.getValue("minlon"); 156 String minlat = atts.getValue("minlat"); 157 String maxlon = atts.getValue("maxlon"); 158 String maxlat = atts.getValue("maxlat"); 159 String origin = atts.getValue("origin"); 160 if (minlon != null && maxlon != null && minlat != null && maxlat != null) { 161 if (origin == null) { 162 origin = generator; 163 } 164 Bounds bounds = new Bounds( 165 new LatLon(Double.parseDouble(minlat), Double.parseDouble(minlon)), 166 new LatLon(Double.parseDouble(maxlat), Double.parseDouble(maxlon))); 167 DataSource src = new DataSource(bounds, origin); 168 ds.dataSources.add(src); 169 } else { 170 throwException(tr( 171 "Missing manadatory attributes on element ''bounds''. Got minlon=''{0}'',minlat=''{1}'',maxlon=''{3}'',maxlat=''{4}'', origin=''{5}''.", 172 minlon, minlat, maxlon, maxlat, origin 173 )); 174 } 175 176 // ---- PARSING NODES AND WAYS ---- 177 178 } else if (qName.equals("node")) { 179 NodeData nd = new NodeData(); 180 nd.setCoor(new LatLon(getDouble(atts, "lat"), getDouble(atts, "lon"))); 181 readCommon(atts, nd); 182 Node n = new Node(nd.getId(), nd.getVersion()); 183 n.load(nd); 184 externalIdMap.put(nd.getPrimitiveId(), n); 185 currentPrimitive = n; 186 currentExternalId = nd.getUniqueId(); 187 } else if (qName.equals("way")) { 188 WayData wd = new WayData(); 189 readCommon(atts, wd); 190 Way w = new Way(wd.getId(), wd.getVersion()); 191 w.load(wd); 192 externalIdMap.put(wd.getPrimitiveId(), w); 193 ways.put(wd.getUniqueId(), new ArrayList<Long>()); 194 currentPrimitive = w; 195 currentExternalId = wd.getUniqueId(); 196 } else if (qName.equals("nd")) { 197 Collection<Long> list = ways.get(currentExternalId); 198 if (list == null) { 199 throwException( 200 tr("Found XML element <nd> not as direct child of element <way>.") 201 ); 202 } 203 if (atts.getValue("ref") == null) { 204 throwException( 205 tr("Missing mandatory attribute ''{0}'' on <nd> of way {1}.", "ref", currentPrimitive.getUniqueId()) 206 ); 207 } 208 long id = getLong(atts, "ref"); 209 if (id == 0) { 210 throwException( 211 tr("Illegal value of attribute ''ref'' of element <nd>. Got {0}.", id) 212 ); 213 } 214 if (currentPrimitive.isDeleted()) { 215 logger.info(tr("Deleted way {0} contains nodes", currentPrimitive.getUniqueId())); 216 } else { 217 list.add(id); 218 } 219 220 // ---- PARSING RELATIONS ---- 221 222 } else if (qName.equals("relation")) { 223 RelationData rd = new RelationData(); 224 readCommon(atts, rd); 225 Relation r = new Relation(rd.getId(), rd.getVersion()); 226 r.load(rd); 227 externalIdMap.put(rd.getPrimitiveId(), r); 228 relations.put(rd.getUniqueId(), new LinkedList<RelationMemberData>()); 229 currentPrimitive = r; 230 currentExternalId = rd.getUniqueId(); 231 } else if (qName.equals("member")) { 232 Collection<RelationMemberData> list = relations.get(currentExternalId); 233 if (list == null) { 234 throwException( 235 tr("Found XML element <member> not as direct child of element <relation>.") 236 ); 237 } 238 RelationMemberData emd = new RelationMemberData(); 239 String value = atts.getValue("ref"); 240 if (value == null) { 241 throwException(tr("Missing attribute ''ref'' on member in relation {0}.",currentPrimitive.getUniqueId())); 242 } 243 try { 244 emd.id = Long.parseLong(value); 245 } catch(NumberFormatException e) { 246 throwException(tr("Illegal value for attribute ''ref'' on member in relation {0}. Got {1}", Long.toString(currentPrimitive.getUniqueId()),value)); 247 } 248 value = atts.getValue("type"); 249 if (value == null) { 250 throwException(tr("Missing attribute ''type'' on member {0} in relation {1}.", Long.toString(emd.id), Long.toString(currentPrimitive.getUniqueId()))); 251 } 252 try { 253 emd.type = OsmPrimitiveType.fromApiTypeName(value); 254 } catch(IllegalArgumentException e) { 255 throwException(tr("Illegal value for attribute ''type'' on member {0} in relation {1}. Got {2}.", Long.toString(emd.id), Long.toString(currentPrimitive.getUniqueId()), value)); 256 } 257 value = atts.getValue("role"); 258 emd.role = value; 259 260 if (emd.id == 0) { 261 throwException(tr("Incomplete <member> specification with ref=0")); 262 } 263 264 if (currentPrimitive.isDeleted()) { 265 logger.info(tr("Deleted relation {0} contains members", currentPrimitive.getUniqueId())); 266 } else { 267 list.add(emd); 268 } 269 270 // ---- PARSING TAGS (applicable to all objects) ---- 271 272 } else if (qName.equals("tag")) { 273 String key = atts.getValue("k"); 274 String value = atts.getValue("v"); 275 if (key == null || value == null) { 276 throwException(tr("Missing key or value attribute in tag.")); 277 } 278 currentPrimitive.put(intern(key), intern(value)); 279 167 280 } else { 168 throwException(tr( 169 "Missing manadatory attributes on element ''bounds''. Got minlon=''{0}'',minlat=''{1}'',maxlon=''{3}'',maxlat=''{4}'', origin=''{5}''.", 170 minlon, minlat, maxlon, maxlat, origin 171 )); 172 } 173 174 // ---- PARSING NODES AND WAYS ---- 175 176 } else if (qName.equals("node")) { 177 NodeData nd = new NodeData(); 178 nd.setCoor(new LatLon(getDouble(atts, "lat"), getDouble(atts, "lon"))); 179 readCommon(atts, nd); 180 Node n = new Node(nd.getId(), nd.getVersion()); 181 n.load(nd); 182 externalIdMap.put(nd.getPrimitiveId(), n); 183 currentPrimitive = n; 184 currentExternalId = nd.getUniqueId(); 185 } else if (qName.equals("way")) { 186 WayData wd = new WayData(); 187 readCommon(atts, wd); 188 Way w = new Way(wd.getId(), wd.getVersion()); 189 w.load(wd); 190 externalIdMap.put(wd.getPrimitiveId(), w); 191 ways.put(wd.getUniqueId(), new ArrayList<Long>()); 192 currentPrimitive = w; 193 currentExternalId = wd.getUniqueId(); 194 } else if (qName.equals("nd")) { 195 Collection<Long> list = ways.get(currentExternalId); 196 if (list == null) { 197 throwException( 198 tr("Found XML element <nd> not as direct child of element <way>.") 199 ); 200 } 201 if (atts.getValue("ref") == null) { 202 throwException( 203 tr("Missing mandatory attribute ''{0}'' on <nd> of way {1}.", "ref", currentPrimitive.getUniqueId()) 204 ); 205 } 206 long id = getLong(atts, "ref"); 207 if (id == 0) { 208 throwException( 209 tr("Illegal value of attribute ''ref'' of element <nd>. Got {0}.", id) 210 ); 211 } 212 if (currentPrimitive.isDeleted()) { 213 logger.info(tr("Deleted way {0} contains nodes", currentPrimitive.getUniqueId())); 214 } else { 215 list.add(id); 216 } 217 218 // ---- PARSING RELATIONS ---- 219 220 } else if (qName.equals("relation")) { 221 RelationData rd = new RelationData(); 222 readCommon(atts, rd); 223 Relation r = new Relation(rd.getId(), rd.getVersion()); 224 r.load(rd); 225 externalIdMap.put(rd.getPrimitiveId(), r); 226 relations.put(rd.getUniqueId(), new LinkedList<RelationMemberData>()); 227 currentPrimitive = r; 228 currentExternalId = rd.getUniqueId(); 229 } else if (qName.equals("member")) { 230 Collection<RelationMemberData> list = relations.get(currentExternalId); 231 if (list == null) { 232 throwException( 233 tr("Found XML element <member> not as direct child of element <relation>.") 234 ); 235 } 236 RelationMemberData emd = new RelationMemberData(); 237 String value = atts.getValue("ref"); 238 if (value == null) { 239 throwException(tr("Missing attribute ''ref'' on member in relation {0}.",currentPrimitive.getUniqueId())); 240 } 241 try { 242 emd.id = Long.parseLong(value); 243 } catch(NumberFormatException e) { 244 throwException(tr("Illegal value for attribute ''ref'' on member in relation {0}. Got {1}", Long.toString(currentPrimitive.getUniqueId()),value)); 245 } 246 value = atts.getValue("type"); 247 if (value == null) { 248 throwException(tr("Missing attribute ''type'' on member {0} in relation {1}.", Long.toString(emd.id), Long.toString(currentPrimitive.getUniqueId()))); 249 } 250 try { 251 emd.type = OsmPrimitiveType.fromApiTypeName(value); 252 } catch(IllegalArgumentException e) { 253 throwException(tr("Illegal value for attribute ''type'' on member {0} in relation {1}. Got {2}.", Long.toString(emd.id), Long.toString(currentPrimitive.getUniqueId()), value)); 254 } 255 value = atts.getValue("role"); 256 emd.role = value; 257 258 if (emd.id == 0) { 259 throwException(tr("Incomplete <member> specification with ref=0")); 260 } 261 262 if (currentPrimitive.isDeleted()) { 263 logger.info(tr("Deleted relation {0} contains members", currentPrimitive.getUniqueId())); 264 } else { 265 list.add(emd); 266 } 267 268 // ---- PARSING TAGS (applicable to all objects) ---- 269 270 } else if (qName.equals("tag")) { 271 String key = atts.getValue("k"); 272 String value = atts.getValue("v"); 273 if (key == null || value == null) { 274 throwException(tr("Missing key or value attribute in tag.")); 275 } 276 currentPrimitive.put(intern(key), intern(value)); 277 278 } else { 279 System.out.println(tr("Undefined element ''{0}'' found in input stream. Skipping.", qName)); 281 System.out.println(tr("Undefined element ''{0}'' found in input stream. Skipping.", qName)); 282 } 283 } catch (Exception e) { 284 throw new SAXParseException(e.getMessage(), locator, e); 280 285 } 281 286 } … … 584 589 } catch(ParserConfigurationException e) { 585 590 throw new IllegalDataException(e.getMessage(), e); 591 } catch (SAXParseException e) { 592 throw new IllegalDataException(tr("Line {0} column {1}: ", e.getLineNumber(), e.getColumnNumber()) + e.getMessage(), e); 586 593 } catch(SAXException e) { 587 594 throw new IllegalDataException(e.getMessage(), e);
Note:
See TracChangeset
for help on using the changeset viewer.