Ignore:
Timestamp:
2019-01-21T09:26:11+01:00 (6 years ago)
Author:
gerdp
Message:

see #17201 Improve progress monitor and react on cancel button, also fix some sonar and checkstyle issues

TODO:

  • cancel doesn't stop reading the file yet. This would require more changes.
  • progress monitor for download from url doesn't work yet
Location:
applications/editors/josm/plugins/pbf
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/pbf/src/org/openstreetmap/josm/plugins/pbf/io/PbfReader.java

    r34826 r34848  
    2929import org.openstreetmap.josm.io.AbstractReader;
    3030import org.openstreetmap.josm.io.IllegalDataException;
     31import org.openstreetmap.josm.io.ImportCancelException;
    3132import org.openstreetmap.josm.tools.CheckParameterUtil;
    3233import org.openstreetmap.josm.tools.Logging;
     
    108109        @Override
    109110        public boolean skipBlock(FileBlockPosition block) {
    110             return exception != null;
     111            return exception != null || cancel;
    111112        }
    112113
     
    146147                    for (int i = 0; i < nodes.getIdCount(); i++) {
    147148                        // Id (delta) and version (normal)
    148                         NodeData nd = new NodeData(nodeId += nodes.getId(i));
     149                        nodeId += nodes.getId(i);
     150                        NodeData nd = new NodeData(nodeId);
    149151                        nd.setVersion(nodes.hasDenseinfo() ? nodes.getDenseinfo().getVersion(i) : 1);
    150152                        // Lat/Lon (delta)
    151                         nd.setCoor(new LatLon(parseLat(nodeLat += nodes.getLat(i)),
    152                                                 parseLon(nodeLon += nodes.getLon(i))).getRoundedToOsmPrecision());
     153                        nodeLat += nodes.getLat(i);
     154                        nodeLon += nodes.getLon(i);
     155                        nd.setCoor(new LatLon(parseLat(nodeLat), parseLon(nodeLon)).getRoundedToOsmPrecision());
    153156                        checkCoordinates(nd.getCoor());
    154157                        if (nodes.hasDenseinfo()) {
     
    156159                            // Changeset (delta)
    157160                            if (info.getChangesetCount() > i) {
    158                                 checkChangesetId(changesetId += info.getChangeset(i));
     161                                changesetId += info.getChangeset(i);
     162                                checkChangesetId(changesetId);
    159163                                nd.setChangesetId((int) changesetId);
    160164                            }
    161165                            // User (delta)
    162166                            if (info.getUidCount() > i && info.getUserSidCount() > i) {
    163                                 nd.setUser(User.createOsmUser(uid += info.getUid(i),
    164                                                  getStringById(suid += info.getUserSid(i))));
     167                                uid += info.getUid(i);
     168                                suid += info.getUserSid(i);
     169                                nd.setUser(User.createOsmUser(uid, getStringById(suid)));
    165170                            }
    166171                            // Timestamp (delta)
    167172                            if (info.getTimestampCount() > i) {
    168                                 checkTimestamp(timestamp += info.getTimestamp(i));
     173                                timestamp += info.getTimestamp(i);
     174                                checkTimestamp(timestamp);
    169175                                nd.setTimestamp(new Date(date_granularity * timestamp));
    170176                            }
     
    235241                        }
    236242                        wd.setKeys(keys);
    237                         long previousId = 0; // Node ids are delta coded
     243                        long id = 0; // Node ids are delta coded
    238244                        Collection<Long> nodeIds = new ArrayList<>();
    239                         for (Long id : w.getRefsList()) {
    240                             nodeIds.add(previousId += id);
     245                        for (Long idDelta : w.getRefsList()) {
     246                            id += idDelta;
     247                            nodeIds.add(id);
    241248                        }
    242249                        ways.put(wd.getUniqueId(), nodeIds);
     
    265272                        }
    266273                        rd.setKeys(keys);
    267                         long previousId = 0; // Member ids are delta coded
     274                        long memId = 0; // Member ids are delta coded
    268275                        Collection<RelationMemberData> members = new ArrayList<>();
    269276                        for (int i = 0; i < r.getMemidsCount(); i++) {
     277                            memId += r.getMemids(i);
    270278                            members.add(new RelationMemberData(
    271279                                    getStringById(r.getRolesSid(i)),
    272280                                    mapOsmType(r.getTypes(i)),
    273                                     previousId += r.getMemids(i)));
     281                                    memId));
    274282                        }
    275283                        relations.put(rd.getUniqueId(), members);
     
    325333    protected DataSet doParseDataSet(InputStream source, ProgressMonitor monitor)
    326334            throws IllegalDataException {
     335        ProgressMonitor.CancelListener cancelListener = () -> {
     336            cancel = true;
     337            monitor.indeterminateSubTask(tr("Canceled: Waiting for reader to react"));
     338        };
     339        monitor.addCancelListener(cancelListener);
     340
    327341        try {
    328             monitor.beginTask(tr("Prepare OSM data...", 2));
     342            monitor.beginTask(tr("Prepare OSM data..."), 3);
    329343            monitor.indeterminateSubTask(tr("Reading OSM data..."));
    330344
    331345            parse(source);
    332346            monitor.worked(1);
    333 
     347            if (cancel) {
     348                throw new ParsingCancelException(tr("Import was canceled"));
     349            }
    334350            monitor.indeterminateSubTask(tr("Preparing data set..."));
    335351            prepareDataSet();
     352            if (cancel) {
     353                throw new ParsingCancelException(tr("Import was canceled"));
     354            }
    336355            monitor.worked(1);
    337356            return getDataSet();
     
    341360            throw new IllegalDataException(e);
    342361        } finally {
    343             monitor.finishTask();
     362            monitor.removeCancelListener(cancelListener);
    344363        }
    345364    }
     
    351370        }
    352371    }
     372
     373    /**
     374     * Exception thrown after user cancellation.
     375     */
     376    private static final class ParsingCancelException extends Exception implements ImportCancelException {
     377        private static final long serialVersionUID = 1L;
     378
     379        ParsingCancelException(String msg) {
     380            super(msg);
     381        }
     382    }
     383
    353384}
  • applications/editors/josm/plugins/pbf/src/org/openstreetmap/josm/plugins/pbf/io/PbfServerReader.java

    r32859 r34848  
    2828            throws OsmTransferException {
    2929        try {
    30             progressMonitor.beginTask(tr("Contacting Server...", 10));
     30            progressMonitor.beginTask(tr("Contacting Server..."));
    3131            return new PbfImporter().parseDataSet(url);
    3232        } catch (Exception e) {
  • applications/editors/josm/plugins/pbf/test/unit/org/openstreetmap/josm/plugins/pbf/io/PbfImporterTest.java

    r34826 r34848  
    8080        assertEquals(97, ds.getRelations().size());
    8181    }
    82    
     82
    8383    /**
    8484     * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/14545">Ticket #14545</a>.
     
    9494    }
    9595
    96    
    9796}
Note: See TracChangeset for help on using the changeset viewer.