Changeset 2198 in josm for trunk/src/org/openstreetmap/josm/gui/io/UploadLayerTask.java
- Timestamp:
- 2009-09-27T16:29:21+02:00 (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/gui/io/UploadLayerTask.java
r2181 r2198 5 5 6 6 import java.util.Collection; 7 import java.util.HashSet; 7 8 9 import org.openstreetmap.josm.actions.upload.CyclicUploadDependencyException; 8 10 import org.openstreetmap.josm.data.APIDataSet; 9 11 import org.openstreetmap.josm.data.osm.Changeset; 10 12 import org.openstreetmap.josm.data.osm.DataSet; 11 13 import org.openstreetmap.josm.data.osm.OsmPrimitive; 14 import org.openstreetmap.josm.data.osm.OsmPrimitiveType; 15 import org.openstreetmap.josm.gui.DefaultNameFormatter; 12 16 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 13 17 import org.openstreetmap.josm.gui.progress.NullProgressMonitor; 14 18 import org.openstreetmap.josm.gui.progress.ProgressMonitor; 15 import org.openstreetmap.josm.io.ChangesetProcessingType; 19 import org.openstreetmap.josm.io.OsmApi; 20 import org.openstreetmap.josm.io.OsmApiPrimitiveGoneException; 16 21 import org.openstreetmap.josm.io.OsmServerWriter; 22 import org.openstreetmap.josm.io.OsmTransferException; 17 23 18 24 /** … … 37 43 private Changeset changeset; 38 44 private boolean closeChangesetAfterUpload; 45 private Collection<OsmPrimitive> toUpload; 46 private HashSet<OsmPrimitive> processedPrimitives; 39 47 40 48 /** … … 42 50 * @param layer the layer. Must not be null. 43 51 * @param monitor a progress monitor. If monitor is null, uses {@see NullProgressMonitor#INSTANCE} 44 * @param changeset the changeset to be used if <code>changesetProcessingType</code> indicates that a new 45 * changeset is to be used 52 * @param changeset the changeset to be used 46 53 * @param closeChangesetAfterUpload true, if the changeset should be closed after the upload 47 54 * @throws IllegalArgumentException thrown, if layer is null … … 57 64 this.changeset = changeset; 58 65 this.closeChangesetAfterUpload = closeChangesetAfterUpload; 66 processedPrimitives = new HashSet<OsmPrimitive>(); 67 } 68 69 protected OsmPrimitive getPrimitive(OsmPrimitiveType type, long id) { 70 for (OsmPrimitive p: toUpload) { 71 if (OsmPrimitiveType.from(p).equals(type) && p.getId() == id) 72 return p; 73 } 74 return null; 75 } 76 77 /** 78 * Retries to recover the upload operation from an exception which was thrown because 79 * an uploaded primitive was already deleted on the server. 80 * 81 * @param e the exception throw by the API 82 * @param monitor a progress monitor 83 * @throws OsmTransferException thrown if we can't recover from the exception 84 */ 85 protected void recoverFromGoneOnServer(OsmApiPrimitiveGoneException e, ProgressMonitor monitor) throws OsmTransferException{ 86 if (!e.isKnownPrimitive()) throw e; 87 OsmPrimitive p = getPrimitive(e.getPrimitiveType(), e.getPrimitiveId()); 88 if (p == null) throw e; 89 if (p.isDeleted()) { 90 // we tried to delete an already deleted primitive. 91 // 92 System.out.println(tr("Warning: primitive ''{0}'' is already deleted on the server. Skipping this primitive and retrying to upload.", p.getDisplayName(DefaultNameFormatter.getInstance()))); 93 processedPrimitives.addAll(writer.getProcessedPrimitives()); 94 processedPrimitives.add(p); 95 toUpload.removeAll(processedPrimitives); 96 return; 97 } 98 // exception was thrown because we tried to *update* an already deleted 99 // primitive. We can't resolve this automatically. Re-throw exception, 100 // a conflict is going to be created later. 101 throw e; 59 102 } 60 103 … … 62 105 public void run() { 63 106 monitor.subTask(tr("Preparing primitives to upload ...")); 64 Collection<OsmPrimitive> toUpload = new APIDataSet(layer.data).getPrimitives(); 107 APIDataSet ds = new APIDataSet(layer.data); 108 try { 109 ds.adjustRelationUploadOrder(); 110 } catch(CyclicUploadDependencyException e) { 111 setLastException(e); 112 return; 113 } 114 toUpload = ds.getPrimitives(); 65 115 if (toUpload.isEmpty()) 66 116 return; 67 117 writer = new OsmServerWriter(); 68 118 try { 69 ProgressMonitor m = monitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false); 70 if (isCancelled()) return; 71 writer.uploadOsm(layer.data.version, toUpload, changeset, closeChangesetAfterUpload, m); 119 while(true) { 120 try { 121 ProgressMonitor m = monitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false); 122 if (isCancelled()) return; 123 writer.uploadOsm(layer.data.version, toUpload, changeset, m); 124 processedPrimitives.addAll(writer.getProcessedPrimitives()); 125 break; 126 } catch(OsmApiPrimitiveGoneException e) { 127 recoverFromGoneOnServer(e, monitor); 128 } 129 } 130 if (closeChangesetAfterUpload) { 131 if (changeset != null && changeset.getId() > 0) { 132 OsmApi.getOsmApi().closeChangeset(changeset, monitor.createSubTaskMonitor(0, false)); 133 } 134 } 72 135 } catch (Exception sxe) { 73 136 if (isCancelled()) { … … 80 143 if (isCancelled()) 81 144 return; 82 layer.cleanupAfterUpload( writer.getProcessedPrimitives());145 layer.cleanupAfterUpload(processedPrimitives); 83 146 DataSet.fireSelectionChanged(layer.data.getSelected()); 84 147 layer.fireDataChange(); 85 148 layer.onPostUploadToServer(); 149 150 // don't process exceptions remembered with setLastException(). 151 // Caller is supposed to deal with them. 86 152 } 87 153 88 154 @Override 89 155 public void cancel() { 90 // make sure the the softCancel operation is serialized with91 // blocks which can be interrupted.92 156 setCancelled(true); 93 157 if (writer != null) {
Note:
See TracChangeset
for help on using the changeset viewer.