Ignore:
Timestamp:
2009-08-03T15:00:34+02:00 (16 years ago)
Author:
Gubaer
Message:

fixed #3158: modify status is not removed for partial uploads

Location:
trunk/src/org/openstreetmap/josm/io
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/io/OsmApi.java

    r1879 r1894  
    507507    }
    508508
     509    /**
     510     * Replies the current changeset
     511     *
     512     * @return the current changeset
     513     */
     514    public Changeset getCurrentChangeset() {
     515        return changeset;
     516    }
    509517}
  • trunk/src/org/openstreetmap/josm/io/OsmServerWriter.java

    r1879 r1894  
    55
    66import java.util.Collection;
     7import java.util.Collections;
    78import java.util.LinkedList;
    89import java.util.List;
     
    1112import org.openstreetmap.josm.Main;
    1213import org.openstreetmap.josm.actions.UploadAction;
     14import org.openstreetmap.josm.data.osm.Changeset;
    1315import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1416import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
     
    3436     * than where passed in the list to upload*.
    3537     */
    36     public Collection<OsmPrimitive> processed;
     38    private Collection<OsmPrimitive> processed;
    3739
    3840    private OsmApi api = OsmApi.getOsmApi();
     
    7981
    8082    /**
     83     * Uploads the changes individually. Invokes one API call per uploaded primitmive.
     84     *
     85     * @param primitives the collection of primitives to upload
     86     * @param progressMonitor the progress monitor
     87     * @throws OsmTransferException thrown if an exception occurs
     88     */
     89    protected void uploadChangesIndividually(Collection<OsmPrimitive> primitives, ProgressMonitor progressMonitor) throws OsmTransferException {
     90        try {
     91            progressMonitor.setTicksCount(primitives.size());
     92            api.createChangeset(getChangesetComment(), progressMonitor.createSubTaskMonitor(0, false));
     93            uploadStartTime = System.currentTimeMillis();
     94            for (OsmPrimitive osm : primitives) {
     95                int progress = progressMonitor.getTicks();
     96                String time_left_str = timeLeft(progress, primitives.size());
     97                progressMonitor.subTask(
     98                        tr("{0}% ({1}/{2}), {3} left. Uploading {4}: {5} (id: {6})",
     99                                Math.round(100.0*progress/primitives.size()), progress,
     100                                primitives.size(), time_left_str,
     101                                OsmPrimitiveType.from(osm).getLocalizedDisplayNameSingular(),
     102                                NAME_FORMATTER.getName(osm),
     103                                osm.id));
     104                makeApiRequest(osm,progressMonitor);
     105                processed.add(osm);
     106                progressMonitor.worked(1);
     107            }
     108        } catch(OsmTransferException e) {
     109            throw e;
     110        } catch(Exception e) {
     111            throw new OsmTransferException(e);
     112        } finally {
     113            try {
     114                api.stopChangeset(progressMonitor.createSubTaskMonitor(0, false));
     115            } catch(Exception e) {
     116                Changeset changeset = api.getCurrentChangeset();
     117                String changesetId = (changeset == null ? tr("unknown") : Long.toString(changeset.id));
     118                logger.warning(tr("Failed to close changeset {0}, will be closed by server after timeout. Exception was: {1}",
     119                        changesetId, e.toString()));
     120            }
     121        }
     122    }
     123
     124    /**
     125     * Upload all changes in one diff upload
     126     *
     127     * @param primitives the collection of primitives to upload
     128     * @param progressMonitor  the progress monitor
     129     * @throws OsmTransferException thrown if an exception occurs
     130     */
     131    protected void uploadChangesAsDiffUpload(Collection<OsmPrimitive> primitives, ProgressMonitor progressMonitor) throws OsmTransferException {
     132        // upload everything in one changeset
     133        //
     134        try {
     135            api.createChangeset(getChangesetComment(), progressMonitor.createSubTaskMonitor(0, false));
     136            processed.addAll(api.uploadDiff(primitives, progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false)));
     137        } catch(OsmTransferException e) {
     138            throw e;
     139        } catch(Exception e) {
     140            throw new OsmTransferException(e);
     141        } finally {
     142            try {
     143                api.stopChangeset(progressMonitor.createSubTaskMonitor(0, false));
     144            } catch (Exception ee) {
     145                Changeset changeset = api.getCurrentChangeset();
     146                String changesetId = (changeset == null ? tr("unknown") : Long.toString(changeset.id));
     147                logger.warning(tr("Failed to close changeset {0}, will be closed by server after timeout. Exception was: {1}",
     148                        changesetId, ee.toString()));
     149            }
     150        }
     151    }
     152
     153    /**
    81154     * Send the dataset to the server.
    82155     *
     
    92165
    93166        try {
    94 
    95167            // check whether we can use changeset
    96168            //
     
    103175
    104176            if (useChangeset) {
    105                 // upload everything in one changeset
    106                 //
    107                 try {
    108                     api.createChangeset(getChangesetComment(), progressMonitor.createSubTaskMonitor(0, false));
    109                     processed.addAll(api.uploadDiff(primitives, progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false)));
    110                 } catch(OsmTransferException e) {
    111                     throw e;
    112                 } finally {
    113                     try {
    114                         if (canUseChangeset) {
    115                             api.stopChangeset(progressMonitor.createSubTaskMonitor(0, false));
    116                         }
    117                     } catch (Exception ee) {
    118                         ee.printStackTrace();
    119                         // ignore nested exception
    120                     }
    121                 }
     177                uploadChangesAsDiffUpload(primitives, progressMonitor);
    122178            } else {
    123                 // upload changes individually (90% of code is for the status display...)
    124                 //
    125                 progressMonitor.setTicksCount(primitives.size());
    126                 api.createChangeset(getChangesetComment(), progressMonitor.createSubTaskMonitor(0, false));
    127                 uploadStartTime = System.currentTimeMillis();
    128                 for (OsmPrimitive osm : primitives) {
    129                     int progress = progressMonitor.getTicks();
    130                     String time_left_str = timeLeft(progress, primitives.size());
    131                     progressMonitor.subTask(
    132                             tr("{0}% ({1}/{2}), {3} left. Uploading {4}: {5} (id: {6})",
    133                                     Math.round(100.0*progress/primitives.size()), progress,
    134                                     primitives.size(), time_left_str,
    135                                     OsmPrimitiveType.from(osm).getLocalizedDisplayNameSingular(),
    136                                     NAME_FORMATTER.getName(osm),
    137                                     osm.id));
    138                     makeApiRequest(osm,progressMonitor);
    139                     processed.add(osm);
    140                     progressMonitor.worked(1);
    141                 }
    142                 api.stopChangeset(progressMonitor.createSubTaskMonitor(0, false));
    143             }
    144 
     179                uploadChangesIndividually(primitives, progressMonitor);
     180            }
    145181        } finally {
    146182            progressMonitor.finishTask();
     
    163199        }
    164200    }
     201
     202    /**
     203     * Replies the collection of successfully processed primitives
     204     *
     205     * @return the collection of successfully processed primitives
     206     */
     207    public Collection<OsmPrimitive> getProcessedPrimitives() {
     208        return processed;
     209    }
    165210}
Note: See TracChangeset for help on using the changeset viewer.