Ticket #23738: 23738-3.patch

File 23738-3.patch, 3.1 KB (added by GerdP, 14 months ago)

now progress monitor also works

  • src/org/openstreetmap/josm/gui/io/UploadPrimitivesTask.java

     
    260260                try {
    261261                    getProgressMonitor().subTask(
    262262                            trn("Uploading {0} object...", "Uploading {0} objects...", toUpload.getSize(), toUpload.getSize()));
     263                    getProgressMonitor().setTicks(0); // needed in 2nd and further loop executions
    263264                    synchronized (this) {
    264265                        writer = new OsmServerWriter();
    265266                    }
  • src/org/openstreetmap/josm/io/OsmServerWriter.java

     
    55import static org.openstreetmap.josm.tools.I18n.tr;
    66import static org.openstreetmap.josm.tools.I18n.trn;
    77
     8import java.time.Instant;
    89import java.util.ArrayList;
    910import java.util.Collection;
    1011import java.util.Iterator;
     
    1819import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    1920import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
    2021import org.openstreetmap.josm.gui.progress.ProgressMonitor;
     22import org.openstreetmap.josm.io.ChangesetClosedException.Source;
    2123import org.openstreetmap.josm.tools.CheckParameterUtil;
    2224
    2325/**
     
    155157            progressMonitor.beginTask(tr("Starting to upload in chunks..."));
    156158            List<OsmPrimitive> chunk = new ArrayList<>(chunkSize);
    157159            Iterator<? extends OsmPrimitive> it = primitives.iterator();
     160            int maxChunkSize = api.getCapabilities().getMaxChangesetSize();
    158161            int numChunks = (int) Math.ceil((double) primitives.size() / (double) chunkSize);
    159162            int i = 0;
    160163            while (it.hasNext()) {
     
    162165                if (canceled) return;
    163166                int j = 0;
    164167                chunk.clear();
    165                 while (it.hasNext() && j < chunkSize) {
    166                     if (canceled) return;
     168                while (it.hasNext() && j < chunkSize && processed.size() + j < maxChunkSize) {
    167169                    j++;
    168170                    chunk.add(it.next());
    169171                }
     
    172174                                "({0}/{1}) Uploading {2} objects...",
    173175                                chunk.size(), i, numChunks, chunk.size()));
    174176                processed.addAll(api.uploadDiff(chunk, progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false)));
     177                // see #23738: server will close CS if maximum changeset size was reached
     178                if (processed.size() >= maxChunkSize) {
     179                    throw new ChangesetClosedException(api.getChangeset().getId(), Instant.now(), Source.UPLOAD_DATA);
     180                }
    175181            }
    176182        } finally {
    177183            progressMonitor.finishTask();