Ticket #18249: 18249.1.patch

File 18249.1.patch, 4.6 KB (added by taylor.smock, 5 years ago)

Add flag to avoid parsing uid and user twice.

  • src/org/openstreetmap/josm/io/OsmReader.java

     
    3939
    4040    protected XMLStreamReader parser;
    4141
     42    protected boolean convertUnknownToTags;
     43
    4244    /**
    4345     * constructor (for private and subclasses use only)
    4446     *
     
    4547     * @see #parseDataSet(InputStream, ProgressMonitor)
    4648     */
    4749    protected OsmReader() {
     50        this(false);
     51    }
     52
     53    /**
     54     * constructor (for private and subclasses use only)
     55     * @param convertUnknownToTags if true, keep unknown xml attributes as tags
     56     *
     57     * @see #parseDataSet(InputStream, ProgressMonitor)
     58     * @since xxx
     59     */
     60    protected OsmReader(boolean convertUnknownToTags) {
    4861        // Restricts visibility
     62        this.convertUnknownToTags = convertUnknownToTags;
    4963    }
    5064
    5165    protected void setParser(XMLStreamReader parser) {
     
    386400     */
    387401    private void readCommon(PrimitiveData current) throws IllegalDataException {
    388402        try {
    389             parseId(current, getLong("id"));
    390             parseTimestamp(current, parser.getAttributeValue(null, "timestamp"));
    391             parseUser(current, parser.getAttributeValue(null, "user"), parser.getAttributeValue(null, "uid"));
    392             parseVisible(current, parser.getAttributeValue(null, "visible"));
    393             parseVersion(current, parser.getAttributeValue(null, "version"));
    394             parseAction(current, parser.getAttributeValue(null, "action"));
    395             parseChangeset(current, parser.getAttributeValue(null, "changeset"));
     403            boolean addedUser = false;
     404            for (int i = 0; i < parser.getAttributeCount(); i++) {
     405                switch (parser.getAttributeLocalName(i)) {
     406                case "id":
     407                    parseId(current, getLong("id"));
     408                    break;
     409                case "timestamp":
     410                    parseTimestamp(current, parser.getAttributeValue(null, "timestamp"));
     411                    break;
     412                case "user":
     413                case "uid":
     414                    if (!addedUser) {
     415                        parseUser(current, parser.getAttributeValue(null, "user"), parser.getAttributeValue(null, "uid"));
     416                        addedUser = true;
     417                    }
     418                    break;
     419                case "visible":
     420                    parseVisible(current, parser.getAttributeValue(null, "visible"));
     421                    break;
     422                case "version":
     423                    parseVersion(current, parser.getAttributeValue(null, "version"));
     424                    break;
     425                case "action":
     426                    parseAction(current, parser.getAttributeValue(null, "action"));
     427                    break;
     428                case "changeset":
     429                    parseChangeset(current, parser.getAttributeValue(null, "changeset"));
     430                    break;
     431                case "lat":
     432                case "lon":
     433                    break;
     434                default:
     435                    if (convertUnknownToTags) {
     436                        parseTag(current, parser.getAttributeLocalName(i), parser.getAttributeValue(i));
     437                    }
     438                }
     439            }
    396440        } catch (UncheckedParseException | XMLStreamException e) {
    397441            throw new IllegalDataException(e);
    398442        }
     
    457501     * @throws IllegalArgumentException if source is null
    458502     */
    459503    public static DataSet parseDataSet(InputStream source, ProgressMonitor progressMonitor) throws IllegalDataException {
    460         return new OsmReader().doParseDataSet(source, progressMonitor);
     504        return parseDataSet(source, progressMonitor, false);
    461505    }
     506
     507    /**
     508     * Parse the given input source and return the dataset.
     509     *
     510     * @param source the source input stream. Must not be null.
     511     * @param progressMonitor the progress monitor. If null, {@link NullProgressMonitor#INSTANCE} is assumed
     512     * @param convertUnknownToTags true if unknown xml attributes should be kept as tags
     513     *
     514     * @return the dataset with the parsed data
     515     * @throws IllegalDataException if an error was found while parsing the data from the source
     516     * @throws IllegalArgumentException if source is null
     517     * @since xxx
     518     */
     519    public static DataSet parseDataSet(InputStream source, ProgressMonitor progressMonitor, boolean convertUnknownToTags)
     520            throws IllegalDataException {
     521        return new OsmReader(convertUnknownToTags).doParseDataSet(source, progressMonitor);
     522    }
    462523}