Ticket #18258: 18258.6.patch
| File 18258.6.patch, 10.5 KB (added by , 6 years ago) |
|---|
-
src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java
734 734 Arrays.asList( 735 735 "created_by", 736 736 "converted_by", 737 "current_id", 737 738 "geobase:datasetName", 738 739 "geobase:uuid", 739 740 "KSJ2:ADS", -
src/org/openstreetmap/josm/io/OsmReader.java
4 4 import static org.openstreetmap.josm.tools.I18n.tr; 5 5 6 6 import java.io.InputStream; 7 import java.util.Arrays; 7 8 import java.util.Collection; 9 import java.util.Collections; 8 10 import java.util.Objects; 9 11 import java.util.Set; 10 12 import java.util.TreeSet; … … 39 41 */ 40 42 public class OsmReader extends AbstractReader { 41 43 44 /** 45 * Options are used to change how the xml data is parsed. 46 * For example, {@link Options#CONVERT_UNKNOWN_TO_TAGS} is used to convert unknown 47 * XML attributes to a tag for the object. 48 */ 49 public enum Options { 50 /** Convert unknown XML attributes to tags */ 51 CONVERT_UNKNOWN_TO_TAGS, 52 /** Save the original id of an object (currently stored in `current_id`) */ 53 SAVE_ORIGINAL_ID 54 } 55 42 56 protected XMLStreamReader parser; 43 57 44 protected boolean convertUnknownToTags; 58 /** The {@link OsmReader.Options} to use when parsing the xml data */ 59 protected Collection<Options> options; 45 60 46 61 private static final Set<String> COMMON_XML_ATTRIBUTES = new TreeSet<>(); 47 62 … … 64 79 * @see #parseDataSet(InputStream, ProgressMonitor) 65 80 */ 66 81 protected OsmReader() { 67 this( false);82 this((Options) null); 68 83 } 69 84 70 85 /** 71 86 * constructor (for private and subclasses use only) 72 * @param convertUnknownToTags if true, keep unknown xml attributes as tags87 * @param options The options to use when reading data 73 88 * 74 89 * @see #parseDataSet(InputStream, ProgressMonitor) 75 * @since 1547090 * @since xxx 76 91 */ 77 protected OsmReader( boolean convertUnknownToTags) {92 protected OsmReader(Options... options) { 78 93 // Restricts visibility 79 this. convertUnknownToTags = convertUnknownToTags;94 this.options = options == null ? Collections.emptyList() : Arrays.asList(options); 80 95 } 81 96 82 97 protected void setParser(XMLStreamReader parser) { … … 425 440 parseAction(current, parser.getAttributeValue(null, "action")); 426 441 parseChangeset(current, parser.getAttributeValue(null, "changeset")); 427 442 428 if (convertUnknownToTags) { 443 if (options.contains(Options.SAVE_ORIGINAL_ID)) { 444 parseTag(current, "current_id", Long.toString(getLong("id"))); 445 } 446 if (options.contains(Options.CONVERT_UNKNOWN_TO_TAGS)) { 429 447 for (int i = 0; i < parser.getAttributeCount(); i++) { 430 448 if (!COMMON_XML_ATTRIBUTES.contains(parser.getAttributeLocalName(i))) { 431 449 parseTag(current, parser.getAttributeLocalName(i), parser.getAttributeValue(i)); … … 496 514 * @throws IllegalArgumentException if source is null 497 515 */ 498 516 public static DataSet parseDataSet(InputStream source, ProgressMonitor progressMonitor) throws IllegalDataException { 499 return parseDataSet(source, progressMonitor, false);517 return parseDataSet(source, progressMonitor, (Options) null); 500 518 } 501 519 502 520 /** … … 504 522 * 505 523 * @param source the source input stream. Must not be null. 506 524 * @param progressMonitor the progress monitor. If null, {@link NullProgressMonitor#INSTANCE} is assumed 507 * @param convertUnknownToTags true if unknown xml attributes should be kept as tags525 * @param options The options to use when parsing the dataset 508 526 * 509 527 * @return the dataset with the parsed data 510 528 * @throws IllegalDataException if an error was found while parsing the data from the source 511 529 * @throws IllegalArgumentException if source is null 512 * @since 15470530 * @since xxx 513 531 */ 514 public static DataSet parseDataSet(InputStream source, ProgressMonitor progressMonitor, boolean convertUnknownToTags)532 public static DataSet parseDataSet(InputStream source, ProgressMonitor progressMonitor, Options... options) 515 533 throws IllegalDataException { 516 return new OsmReader( convertUnknownToTags).doParseDataSet(source, progressMonitor);534 return new OsmReader(options).doParseDataSet(source, progressMonitor); 517 535 } 518 536 } -
test/unit/org/openstreetmap/josm/io/OsmReaderTest.java
22 22 import org.openstreetmap.josm.data.osm.Way; 23 23 import org.openstreetmap.josm.gui.progress.NullProgressMonitor; 24 24 import org.openstreetmap.josm.gui.progress.ProgressMonitor; 25 import org.openstreetmap.josm.io.OsmReader.Options; 25 26 import org.openstreetmap.josm.testutils.JOSMTestRules; 26 27 27 28 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; … … 82 83 private static void testUnknown(String osm, boolean parseUnknownAttributes) throws Exception { 83 84 try (InputStream in = new ByteArrayInputStream( 84 85 ("<?xml version='1.0' encoding='UTF-8'?>" + osm).getBytes(StandardCharsets.UTF_8))) { 85 assertTrue(OsmReader.parseDataSet(in, NullProgressMonitor.INSTANCE, parseUnknownAttributes).allPrimitives()86 assertTrue(OsmReader.parseDataSet(in, NullProgressMonitor.INSTANCE, Options.CONVERT_UNKNOWN_TO_TAGS).allPrimitives() 86 87 .isEmpty()); 87 88 } 89 testUnknown(osm, parseUnknownAttributes, true); 90 testUnknown(osm, parseUnknownAttributes, true); 88 91 } 89 92 93 private static void testUnknown(String osm, boolean parseUnknownAttributes, boolean keepOriginalId) 94 throws Exception { 95 try (InputStream in = new ByteArrayInputStream( 96 ("<?xml version='1.0' encoding='UTF-8'?>" + osm).getBytes(StandardCharsets.UTF_8))) { 97 assertTrue(OsmReader.parseDataSet(in, NullProgressMonitor.INSTANCE, Options.CONVERT_UNKNOWN_TO_TAGS, Options.SAVE_ORIGINAL_ID) 98 .allPrimitives().isEmpty()); 99 } 100 } 101 90 102 /** 91 103 * Unit test of {@link OsmReader#parseUnknown} - root case. 92 104 * @throws Exception if any error occurs … … 140 152 /** 141 153 * Test valid data. 142 154 * @param osm OSM data without XML prefix 143 * @param parseUnknownAttributes if true, attempt to parse unknown xml attributes155 * @param options The options to use to parse the data 144 156 * @return parsed data set 145 157 * @throws Exception if any error occurs 146 158 */ 147 private static DataSet testValidData(String osm, boolean parseUnknownAttributes) throws Exception {159 private static DataSet testValidData(String osm, Options... options) throws Exception { 148 160 try (InputStream in = new ByteArrayInputStream( 149 161 ("<?xml version='1.0' encoding='UTF-8'?>" + osm).getBytes(StandardCharsets.UTF_8))) { 150 return OsmReader.parseDataSet(in, NullProgressMonitor.INSTANCE, parseUnknownAttributes);162 return OsmReader.parseDataSet(in, NullProgressMonitor.INSTANCE, options); 151 163 } 152 164 } 153 165 … … 182 194 throws Exception { 183 195 try (InputStream in = new ByteArrayInputStream( 184 196 ("<?xml version='1.0' encoding='UTF-8'?>" + osm).getBytes(StandardCharsets.UTF_8))) { 185 OsmReader.parseDataSet(in, NullProgressMonitor.INSTANCE, parseUnknownAttributes);197 OsmReader.parseDataSet(in, NullProgressMonitor.INSTANCE, Options.CONVERT_UNKNOWN_TO_TAGS); 186 198 fail("should throw exception"); 187 199 } catch (IllegalDataException e) { 188 200 assertEquals(expectedError, e.getMessage()); … … 324 336 public void testGdprChangeset() throws Exception { 325 337 String gdprChangeset = "<osm version='0.6'><node id='1' version='1' changeset='0'/></osm>"; 326 338 testValidData(gdprChangeset); 327 testValidData(gdprChangeset, true); 328 testValidData(gdprChangeset, false); 339 testValidData(gdprChangeset, Options.CONVERT_UNKNOWN_TO_TAGS); 340 testValidData(gdprChangeset, (Options) null); 341 testValidData(gdprChangeset, Options.SAVE_ORIGINAL_ID); 342 testValidData(gdprChangeset, Options.values()); 329 343 } 330 344 331 345 /** … … 405 419 "<meta osm_base=\"2018-08-30T12:46:02Z\" areas=\"2018-08-30T12:40:02Z\"/>\r\n" + 406 420 "<remark>runtime error: Query ran out of memory in \"query\" at line 5.</remark>\r\n" + 407 421 "</osm>"; 408 for (DataSet ds : Arrays.asList(testValidData(query), testValidData(query, true), testValidData(query, false))) { 422 for (DataSet ds : Arrays.asList(testValidData(query), testValidData(query, Options.CONVERT_UNKNOWN_TO_TAGS), testValidData(query, (Options) null), 423 testValidData(query, Options.SAVE_ORIGINAL_ID), testValidData(query, Options.values()))) { 409 424 assertEquals("runtime error: Query ran out of memory in \"query\" at line 5.", ds.getRemark()); 410 425 } 411 426 } … … 420 435 + "<node id='1' version='1' visible='true' changeset='82' randomkey='randomvalue'></node>" + "</osm>"; 421 436 DataSet ds = testValidData(testData); 422 437 assertEquals(0, ds.getNodes().iterator().next().getKeys().size()); 438 assertEquals(1, ds.getNodes().iterator().next().getUniqueId()); 423 439 424 ds = testValidData(testData, true);440 ds = testValidData(testData, Options.CONVERT_UNKNOWN_TO_TAGS); 425 441 Node firstNode = ds.getNodes().iterator().next(); 426 442 assertEquals(1, firstNode.getKeys().size()); 427 443 assertEquals("randomvalue", firstNode.get("randomkey")); 444 assertEquals(1, ds.getNodes().iterator().next().getUniqueId()); 428 445 429 ds = testValidData(testData, false); 446 447 ds = testValidData(testData, (Options) null); 430 448 assertEquals(0, ds.getNodes().iterator().next().getKeys().size()); 449 assertEquals(1, ds.getNodes().iterator().next().getUniqueId()); 431 450 } 432 451 }
