Ignore:
Timestamp:
2019-01-16T09:13:03+01:00 (6 years ago)
Author:
gerdp
Message:

fix #14545 - Open edited pbf file fails (negative IDs)

  • use AbstractReader.buildPrimitive()
  • add unit test
Location:
applications/editors/josm/plugins/pbf
Files:
2 added
3 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/pbf/.project

    r32859 r34826  
    44        <comment></comment>
    55        <projects>
     6                <project>josm</project>
    67        </projects>
    78        <buildSpec>
  • applications/editors/josm/plugins/pbf/src/org/openstreetmap/josm/plugins/pbf/io/PbfReader.java

    r34098 r34826  
    1717import org.openstreetmap.josm.data.coor.LatLon;
    1818import org.openstreetmap.josm.data.osm.DataSet;
     19import org.openstreetmap.josm.data.osm.NodeData;
     20import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
     21import org.openstreetmap.josm.data.osm.PrimitiveData;
     22import org.openstreetmap.josm.data.osm.RelationData;
     23import org.openstreetmap.josm.data.osm.RelationMemberData;
    1924import org.openstreetmap.josm.data.osm.UploadPolicy;
    20 import org.openstreetmap.josm.data.osm.Node;
    21 import org.openstreetmap.josm.data.osm.OsmPrimitive;
    22 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    23 import org.openstreetmap.josm.data.osm.Relation;
    24 import org.openstreetmap.josm.data.osm.RelationMemberData;
    2525import org.openstreetmap.josm.data.osm.User;
    26 import org.openstreetmap.josm.data.osm.Way;
     26import org.openstreetmap.josm.data.osm.WayData;
    2727import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
    2828import org.openstreetmap.josm.gui.progress.ProgressMonitor;
     
    9292        }
    9393
    94         private void setMetadata(OsmPrimitive osm, Info info) throws IllegalDataException {
     94        private void setMetadata(PrimitiveData osm, Info info) throws IllegalDataException {
    9595            if (info.hasChangeset()) {
    9696                checkChangesetId(info.getChangeset());
     
    146146                    for (int i = 0; i < nodes.getIdCount(); i++) {
    147147                        // Id (delta) and version (normal)
    148                         Node node = new Node(nodeId += nodes.getId(i), nodes.hasDenseinfo() ? nodes.getDenseinfo().getVersion(i) : 1);
     148                        NodeData nd = new NodeData(nodeId += nodes.getId(i));
     149                        nd.setVersion(nodes.hasDenseinfo() ? nodes.getDenseinfo().getVersion(i) : 1);
    149150                        // Lat/Lon (delta)
    150                         node.setCoor(new LatLon(parseLat(nodeLat += nodes.getLat(i)),
     151                        nd.setCoor(new LatLon(parseLat(nodeLat += nodes.getLat(i)),
    151152                                                parseLon(nodeLon += nodes.getLon(i))).getRoundedToOsmPrecision());
    152                         checkCoordinates(node.getCoor());
     153                        checkCoordinates(nd.getCoor());
    153154                        if (nodes.hasDenseinfo()) {
    154155                            DenseInfo info = nodes.getDenseinfo();
     
    156157                            if (info.getChangesetCount() > i) {
    157158                                checkChangesetId(changesetId += info.getChangeset(i));
    158                                 node.setChangesetId((int) changesetId);
     159                                nd.setChangesetId((int) changesetId);
    159160                            }
    160161                            // User (delta)
    161162                            if (info.getUidCount() > i && info.getUserSidCount() > i) {
    162                                 node.setUser(User.createOsmUser(uid += info.getUid(i),
     163                                nd.setUser(User.createOsmUser(uid += info.getUid(i),
    163164                                                 getStringById(suid += info.getUserSid(i))));
    164165                            }
     
    166167                            if (info.getTimestampCount() > i) {
    167168                                checkTimestamp(timestamp += info.getTimestamp(i));
    168                                 node.setTimestamp(new Date(date_granularity * timestamp));
     169                                nd.setTimestamp(new Date(date_granularity * timestamp));
    169170                            }
    170171                        }
     
    183184                            }
    184185                        }
    185                         node.setKeys(keys);
    186                         externalIdMap.put(node.getPrimitiveId(), node);
     186                        nd.setKeys(keys);
     187                        buildPrimitive(nd);
    187188                    }
    188189                } catch (IllegalDataException e) {
     
    200201                        if (!info.hasVersion())
    201202                            discourageUpload = true;
    202                         final Node node = new Node(n.getId(), info.hasVersion() ? info.getVersion() : 1);
    203                         node.setCoor(new LatLon(parseLat(n.getLat()), parseLon(n.getLon())).getRoundedToOsmPrecision());
    204                         checkCoordinates(node.getCoor());
    205                         setMetadata(node, info);
     203                        NodeData nd = new NodeData(n.getId());
     204                        nd.setVersion(info.hasVersion() ? info.getVersion() : 1);
     205                        nd.setCoor(new LatLon(parseLat(n.getLat()), parseLon(n.getLon())).getRoundedToOsmPrecision());
     206                        checkCoordinates(nd.getCoor());
     207                        setMetadata(nd, info);
    206208                        Map<String, String> keys = new HashMap<>();
    207209                        for (int i = 0; i < n.getKeysCount(); i++) {
    208210                            keys.put(getStringById(n.getKeys(i)), getStringById(n.getVals(i)));
    209211                        }
    210                         node.setKeys(keys);
    211                         externalIdMap.put(node.getPrimitiveId(), node);
     212                        nd.setKeys(keys);
     213                        buildPrimitive(nd);
    212214                    }
    213215                } catch (IllegalDataException e) {
     
    225227                        if (!info.hasVersion())
    226228                            discourageUpload = true;
    227                         final Way way = new Way(w.getId(), info.hasVersion() ? info.getVersion() : 1);
    228                         setMetadata(way, info);
     229                        final WayData wd = new WayData(w.getId());
     230                        wd.setVersion(info.hasVersion() ? info.getVersion() : 1);
     231                        setMetadata(wd, info);
    229232                        Map<String, String> keys = new HashMap<>();
    230233                        for (int i = 0; i < w.getKeysCount(); i++) {
    231234                            keys.put(getStringById(w.getKeys(i)), getStringById(w.getVals(i)));
    232235                        }
    233                         way.setKeys(keys);
     236                        wd.setKeys(keys);
    234237                        long previousId = 0; // Node ids are delta coded
    235238                        Collection<Long> nodeIds = new ArrayList<>();
     
    237240                            nodeIds.add(previousId += id);
    238241                        }
    239                         ways.put(way.getUniqueId(), nodeIds);
    240                         externalIdMap.put(way.getPrimitiveId(), way);
     242                        ways.put(wd.getUniqueId(), nodeIds);
     243                        buildPrimitive(wd);
    241244                    }
    242245                } catch (IllegalDataException e) {
     
    254257                        if (!info.hasVersion())
    255258                            discourageUpload = true;
    256                         final Relation rel = new Relation(r.getId(), info.hasVersion() ? info.getVersion() : 1);
    257                         setMetadata(rel, info);
     259                        final RelationData rd = new RelationData(r.getId());
     260                        rd.setVersion(info.hasVersion() ? info.getVersion() : 1);
     261                        setMetadata(rd, info);
    258262                        Map<String, String> keys = new HashMap<>();
    259263                        for (int i = 0; i < r.getKeysCount(); i++) {
    260264                            keys.put(getStringById(r.getKeys(i)), getStringById(r.getVals(i)));
    261265                        }
    262                         rel.setKeys(keys);
     266                        rd.setKeys(keys);
    263267                        long previousId = 0; // Member ids are delta coded
    264268                        Collection<RelationMemberData> members = new ArrayList<>();
     
    269273                                    previousId += r.getMemids(i)));
    270274                        }
    271                         relations.put(rel.getUniqueId(), members);
    272                         externalIdMap.put(rel.getPrimitiveId(), rel);
     275                        relations.put(rd.getUniqueId(), members);
     276                        buildPrimitive(rd);
    273277                    }
    274278                } catch (IllegalDataException e) {
  • applications/editors/josm/plugins/pbf/test/unit/org/openstreetmap/josm/plugins/pbf/io/PbfImporterTest.java

    r32861 r34826  
    8080        assertEquals(97, ds.getRelations().size());
    8181    }
     82   
     83    /**
     84     * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/14545">Ticket #14545</a>.
     85     * @throws Exception if an error occurs
     86     */
     87    @Test
     88    public void testTicket14545() throws Exception {
     89        DataSet ds = new PbfImporter().parseDataSet(TestUtils.getRegressionDataFile(14545, "reg14545.osm.pbf"));
     90        assertNotNull(ds);
     91        assertEquals(12, ds.getNodes().size());
     92        assertEquals(2, ds.getWays().size());
     93        assertEquals(1, ds.getRelations().size());
     94    }
     95
     96   
    8297}
Note: See TracChangeset for help on using the changeset viewer.