Ticket #9634: ticket9634_2014-04-11_00:53:42_+0200.patch
File ticket9634_2014-04-11_00:53:42_+0200.patch, 23.7 KB (added by , 10 years ago) |
---|
-
src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java
diff --git src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java index 5bae4eb..10307bc 100644
package org.openstreetmap.josm.actions; 3 3 4 4 import static org.openstreetmap.josm.gui.help.HelpUtil.ht; 5 5 import static org.openstreetmap.josm.tools.I18n.tr; 6 import static org.openstreetmap.josm.tools.I18n.trn;7 6 8 import java.awt.Font;9 import java.awt.GridBagLayout;10 7 import java.awt.event.ActionEvent; 11 8 import java.awt.event.KeyEvent; 12 import java.lang.reflect.InvocationTargetException;13 9 import java.util.List; 14 import java.util.Set;15 import java.util.TreeSet;16 17 import javax.swing.JLabel;18 import javax.swing.JOptionPane;19 import javax.swing.JPanel;20 import javax.swing.JScrollPane;21 import javax.swing.SwingUtilities;22 10 23 11 import org.openstreetmap.josm.Main; 24 import org.openstreetmap.josm.actions.downloadtasks.DownloadReferrersTask;25 import org.openstreetmap.josm.data.osm.DataSet;26 import org.openstreetmap.josm.data.osm.OsmPrimitive;27 12 import org.openstreetmap.josm.data.osm.PrimitiveId; 28 import org.openstreetmap.josm.gui.ExtendedDialog;29 13 import org.openstreetmap.josm.gui.download.DownloadObjectDialog; 30 import org.openstreetmap.josm.gui.io.DownloadPrimitivesTask; 31 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 32 import org.openstreetmap.josm.gui.widgets.HtmlPanel; 33 import org.openstreetmap.josm.gui.widgets.JosmTextArea; 34 import org.openstreetmap.josm.tools.GBC; 14 import org.openstreetmap.josm.gui.io.DownloadPrimitivesWithReferrersTask; 35 15 import org.openstreetmap.josm.tools.Shortcut; 36 import org.openstreetmap.josm.tools.Utils;37 16 38 17 /** 39 18 * Download an OsmPrimitive by specifying type and ID … … public class DownloadPrimitiveAction extends JosmAction { 62 41 63 42 /** 64 43 * @param newLayer if the data should be downloaded into a new layer 65 * @param ids 44 * @param ids List of primitive id to download 66 45 * @param downloadReferrers if the referrers of the object should be downloaded as well, i.e., parent relations, and for nodes, additionally, parent ways 67 46 * @param full if the members of a relation should be downloaded as well 68 47 */ 69 48 public static void processItems(boolean newLayer, final List<PrimitiveId> ids, boolean downloadReferrers, boolean full) { 70 OsmDataLayer layer = getEditLayer(); 71 if ((layer == null) || newLayer) { 72 layer = new OsmDataLayer(new DataSet(), OsmDataLayer.createNewName(), null); 73 Main.main.addLayer(layer); 74 } 75 final DownloadPrimitivesTask task = new DownloadPrimitivesTask(layer, ids, full); 76 Main.worker.submit(task); 77 78 if (downloadReferrers) { 79 for (PrimitiveId id : ids) { 80 Main.worker.submit(new DownloadReferrersTask(layer, id)); 81 } 82 } 49 System.out.printf("DEBUG: DownloadPrimitiveAction.processItems\n"); 83 50 84 Runnable showErrorsAndWarnings = new Runnable() { 85 @Override 86 public void run() { 87 final Set<PrimitiveId> errs = task.getMissingPrimitives(); 88 if (errs != null && !errs.isEmpty()) { 89 try { 90 SwingUtilities.invokeAndWait(new Runnable() { 91 @Override 92 public void run() { 93 reportProblemDialog(errs, 94 trn("Object could not be downloaded", "Some objects could not be downloaded", errs.size()), 95 trn("One object could not be downloaded.<br>", 96 "{0} objects could not be downloaded.<br>", 97 errs.size(), 98 errs.size()) 99 + tr("The server replied with response code 404.<br>" 100 + "This usually means, the server does not know an object with the requested id."), 101 tr("missing objects:"), 102 JOptionPane.ERROR_MESSAGE 103 ).showDialog(); 104 } 105 }); 106 } catch (InterruptedException ex) { 107 Main.warn("InterruptedException while displaying error dialog"); 108 } catch (InvocationTargetException ex) { 109 Main.warn(ex); 110 } 111 } 112 113 final Set<PrimitiveId> del = new TreeSet<PrimitiveId>(); 114 DataSet ds = getCurrentDataSet(); 115 for (PrimitiveId id : ids) { 116 OsmPrimitive osm = ds.getPrimitiveById(id); 117 if (osm != null && osm.isDeleted()) { 118 del.add(id); 119 } 120 } 121 if (!del.isEmpty()) { 122 SwingUtilities.invokeLater(new Runnable() { 123 @Override 124 public void run() { 125 reportProblemDialog(del, 126 trn("Object deleted", "Objects deleted", del.size()), 127 trn( 128 "One downloaded object is deleted.", 129 "{0} downloaded objects are deleted.", 130 del.size(), 131 del.size()), 132 null, 133 JOptionPane.WARNING_MESSAGE 134 ).showDialog(); 135 } 136 }); 137 } 138 } 139 }; 140 Main.worker.submit(showErrorsAndWarnings); 141 } 51 final DownloadPrimitivesWithReferrersTask task = 52 new DownloadPrimitivesWithReferrersTask(newLayer, ids, downloadReferrers, full, null); 53 Main.worker.submit(task); 142 54 143 private static ExtendedDialog reportProblemDialog(Set<PrimitiveId> errs, 144 String TITLE, String TEXT, String LIST_LABEL, int msgType) { 145 JPanel p = new JPanel(new GridBagLayout()); 146 p.add(new HtmlPanel(TEXT), GBC.eop()); 147 if (LIST_LABEL != null) { 148 JLabel missing = new JLabel(LIST_LABEL); 149 missing.setFont(missing.getFont().deriveFont(Font.PLAIN)); 150 p.add(missing, GBC.eol()); 55 System.out.printf("task done\n"); 151 56 } 152 JosmTextArea txt = new JosmTextArea();153 txt.setFont(new Font("Monospaced", txt.getFont().getStyle(), txt.getFont().getSize()));154 txt.setEditable(false);155 txt.setBackground(p.getBackground());156 txt.setColumns(40);157 txt.setRows(1);158 txt.setText(Utils.join(", ", errs));159 JScrollPane scroll = new JScrollPane(txt);160 p.add(scroll, GBC.eop().weight(1.0, 0.0).fill(GBC.HORIZONTAL));161 57 162 return new ExtendedDialog(163 Main.parent,164 TITLE,165 new String[] { tr("Ok") })166 .setButtonIcons(new String[] { "ok" })167 .setIcon(msgType)168 .setContent(p, false);169 }170 58 } -
src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java
diff --git src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java index ce7c850..15d7a57 100644
public class DownloadReferrersTask extends PleaseWaitRunnable { 130 130 * 131 131 */ 132 132 public DownloadReferrersTask(OsmDataLayer targetLayer, PrimitiveId primitiveId) throws IllegalArgumentException { 133 super("Download referrers", false /* don't ignore exception*/); 133 this(targetLayer, primitiveId, null); 134 } 135 136 /** 137 * constructor 138 * 139 * @param targetLayer the target layer. Must not be null. 140 * @param primitiveId a PrimitiveId object. 141 * @param progressMonitor ProgressMonitor to use or null to create a new one. 142 * @exception IllegalArgumentException thrown if id <= 0 143 * @exception IllegalArgumentException thrown if targetLayer == null 144 * 145 */ 146 public DownloadReferrersTask(OsmDataLayer targetLayer, PrimitiveId primitiveId, 147 ProgressMonitor progressMonitor) throws IllegalArgumentException { 148 super("Download referrers", progressMonitor, false /* don't ignore exception*/); 134 149 CheckParameterUtil.ensureParameterNotNull(targetLayer, "targetLayer"); 135 150 if (primitiveId.isNew()) 136 151 throw new IllegalArgumentException(MessageFormat.format("Cannot download referrers for new primitives (ID {0})", primitiveId.getUniqueId())); … … public class DownloadReferrersTask extends PleaseWaitRunnable { 167 182 @Override 168 183 public void run() { 169 184 targetLayer.onPostDownloadFromServer(); 170 Main.map.mapView.repaint(); 185 if(Main.map != null) 186 Main.map.mapView.repaint(); 171 187 } 172 188 } 173 189 ); -
src/org/openstreetmap/josm/gui/io/DownloadPrimitivesTask.java
diff --git src/org/openstreetmap/josm/gui/io/DownloadPrimitivesTask.java src/org/openstreetmap/josm/gui/io/DownloadPrimitivesTask.java index 519a151..ef2934d 100644
import java.io.IOException; 8 8 import java.util.List; 9 9 import java.util.Set; 10 10 11 import org.openstreetmap.josm.Main; 11 12 import org.openstreetmap.josm.actions.AutoScaleAction; 12 13 import org.openstreetmap.josm.data.osm.DataSet; 13 14 import org.openstreetmap.josm.data.osm.DataSetMerger; … … public class DownloadPrimitivesTask extends PleaseWaitRunnable { 51 52 * @throws IllegalArgumentException thrown if layer is null. 52 53 */ 53 54 public DownloadPrimitivesTask(OsmDataLayer layer, List<PrimitiveId> ids, boolean fullRelation) throws IllegalArgumentException { 54 super(tr("Download objects"), false /* don't ignore exception */); 55 this(layer, ids, fullRelation, null); 56 } 57 58 /** 59 * Creates the task 60 * 61 * @param layer the layer in which primitives are updated. Must not be null. 62 * @param ids a collection of primitives to update from the server. Set to 63 * the empty collection if null. 64 * @param fullRelation true if a full download is required, i.e., 65 * a download including the immediate children of a relation. 66 * @param progressMonitor ProgressMonitor to use or null to create a new one. 67 * @throws IllegalArgumentException thrown if layer is null. 68 */ 69 public DownloadPrimitivesTask(OsmDataLayer layer, List<PrimitiveId> ids, boolean fullRelation, 70 ProgressMonitor progessMonitor) throws IllegalArgumentException { 71 super(tr("Download objects"), progessMonitor, false /* don't ignore exception */); 55 72 ensureParameterNotNull(layer, "layer"); 56 73 this.ids = ids; 57 74 this.layer = layer; … … public class DownloadPrimitivesTask extends PleaseWaitRunnable { 83 100 @Override 84 101 public void run() { 85 102 layer.mergeFrom(ds); 86 AutoScaleAction.zoomTo(ds.allPrimitives()); 103 if(Main.map != null) 104 AutoScaleAction.zoomTo(ds.allPrimitives()); 87 105 layer.onPostDownloadFromServer(); 88 106 } 89 107 }); -
new file src/org/openstreetmap/josm/gui/io/DownloadPrimitivesWithReferrersTask.java
diff --git src/org/openstreetmap/josm/gui/io/DownloadPrimitivesWithReferrersTask.java src/org/openstreetmap/josm/gui/io/DownloadPrimitivesWithReferrersTask.java new file mode 100644 index 0000000..d661297
- + 1 package org.openstreetmap.josm.gui.io; 2 3 import static org.openstreetmap.josm.tools.I18n.tr; 4 import static org.openstreetmap.josm.tools.I18n.trn; 5 6 import java.awt.Font; 7 import java.awt.GridBagLayout; 8 import java.io.IOException; 9 import java.lang.reflect.InvocationTargetException; 10 import java.util.List; 11 import java.util.Set; 12 import java.util.TreeSet; 13 14 import javax.swing.JLabel; 15 import javax.swing.JOptionPane; 16 import javax.swing.JPanel; 17 import javax.swing.JScrollPane; 18 import javax.swing.SwingUtilities; 19 20 import org.openstreetmap.josm.Main; 21 import org.openstreetmap.josm.actions.downloadtasks.DownloadReferrersTask; 22 import org.openstreetmap.josm.data.osm.DataSet; 23 import org.openstreetmap.josm.data.osm.OsmPrimitive; 24 import org.openstreetmap.josm.data.osm.PrimitiveId; 25 import org.openstreetmap.josm.gui.ExtendedDialog; 26 import org.openstreetmap.josm.gui.PleaseWaitRunnable; 27 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 28 import org.openstreetmap.josm.gui.progress.ProgressMonitor; 29 import org.openstreetmap.josm.gui.widgets.HtmlPanel; 30 import org.openstreetmap.josm.gui.widgets.JosmTextArea; 31 import org.openstreetmap.josm.io.OsmTransferException; 32 import org.openstreetmap.josm.tools.GBC; 33 import org.openstreetmap.josm.tools.Utils; 34 import org.xml.sax.SAXException; 35 36 /** 37 * Task for downloading a set of primitives with all referrers. 38 */ 39 public class DownloadPrimitivesWithReferrersTask extends PleaseWaitRunnable { 40 /** If true download into a new layer */ 41 private final boolean newLayer; 42 /** List of primitives id to download */ 43 private final List<PrimitiveId> ids; 44 /** If true, download members for relation */ 45 private final boolean full; 46 /** If true, download also referrers */ 47 private final boolean downloadReferrers; 48 49 /** Temporary layer where downloaded primitives are put */ 50 private OsmDataLayer tmpLayer; 51 /** Reference to the task that download requested primitives */ 52 private DownloadPrimitivesTask mainTask; 53 /** Flag indicated that user ask for cancel this task */ 54 private boolean canceled = false; 55 /** Reference to the task currently running */ 56 private PleaseWaitRunnable currentTask = null; 57 58 /** 59 * Constructor 60 * 61 * @param newLayer if the data should be downloaded into a new layer 62 * @param ids List of primitive id to download 63 * @param downloadReferrers if the referrers of the object should be downloaded as well, 64 * i.e., parent relations, and for nodes, additionally, parent ways 65 * @param full if the members of a relation should be downloaded as well 66 * @param monitor ProgressMonitor to use, or null to create a new one 67 */ 68 public DownloadPrimitivesWithReferrersTask(boolean newLayer, List<PrimitiveId> ids, boolean downloadReferrers, 69 boolean full, ProgressMonitor monitor) { 70 super(tr("Download objects"), monitor, false); 71 this.ids = ids; 72 this.downloadReferrers = downloadReferrers; 73 this.full = full; 74 this.newLayer = newLayer; 75 // All downloaded primitives are put in a tmpLayer 76 tmpLayer = new OsmDataLayer(new DataSet(), OsmDataLayer.createNewName(), null); 77 //Main.main.addLayer(tmpLayer); 78 } 79 80 @Override 81 protected void cancel() { 82 synchronized(this) { 83 canceled = true; 84 if(currentTask != null) 85 currentTask.operationCanceled(); 86 } 87 } 88 89 @Override 90 protected void realRun() throws SAXException, IOException, OsmTransferException { 91 getProgressMonitor().setTicksCount(ids.size()+1); 92 // First, download primitives 93 mainTask = new DownloadPrimitivesTask(tmpLayer, ids, full, getProgressMonitor().createSubTaskMonitor(1, false)); 94 currentTask = mainTask; 95 synchronized(this) { 96 if(canceled) { 97 currentTask = null; 98 return; 99 } 100 } 101 currentTask.run(); 102 // Then, download referrers for each primitive 103 if(downloadReferrers) 104 for(PrimitiveId id : ids) { 105 System.out.printf("referrers task %s, canceled=%b\n", id.toString(), canceled); 106 synchronized(this) { 107 if(canceled) { 108 currentTask = null; 109 return; 110 } 111 } 112 currentTask = new DownloadReferrersTask( 113 tmpLayer, id, getProgressMonitor().createSubTaskMonitor(1, false)); 114 currentTask.run(); 115 } 116 currentTask = null; 117 } 118 119 @Override 120 protected void finish() { 121 if(canceled) { 122 // Main.map.mapView. 123 return; 124 } 125 OsmDataLayer layer = Main.main.getEditLayer(); 126 if(layer == null || this.newLayer) { 127 Main.main.addLayer(tmpLayer); 128 } else { 129 layer.mergeFrom(tmpLayer); 130 } 131 //showErrorsAndWarnings(); 132 final Set<PrimitiveId> errs = mainTask.getMissingPrimitives(); 133 if (errs != null && !errs.isEmpty()) 134 Main.main.getCurrentDataSet().setSelected(ids); 135 136 System.out.println("finish done"); 137 } 138 139 private void showErrorsAndWarnings() { 140 // FIXME: Does all task are really finish ? 141 System.out.printf("call to finish\n"); 142 Main.worker.submit(new Runnable() { 143 @Override 144 public void run() { 145 final Set<PrimitiveId> errs = mainTask.getMissingPrimitives(); 146 if (errs != null && !errs.isEmpty()) { 147 try { 148 SwingUtilities.invokeAndWait(new Runnable() { 149 @Override 150 public void run() { 151 reportProblemDialog(errs, 152 trn("Object could not be downloaded", "Some objects could not be downloaded", errs.size()), 153 trn("One object could not be downloaded.<br>", 154 "{0} objects could not be downloaded.<br>", 155 errs.size(), 156 errs.size()) 157 + tr("The server replied with response code 404.<br>" 158 + "This usually means, the server does not know an object with the requested id."), 159 tr("missing objects:"), 160 JOptionPane.ERROR_MESSAGE 161 ).showDialog(); 162 } 163 }); 164 } catch (InterruptedException ex) { 165 Main.warn("InterruptedException while displaying error dialog"); 166 } catch (InvocationTargetException ex) { 167 Main.warn(ex); 168 } 169 } 170 171 final Set<PrimitiveId> del = new TreeSet<PrimitiveId>(); 172 DataSet ds = Main.main.getCurrentDataSet(); 173 for (PrimitiveId id : ids) { 174 OsmPrimitive osm = ds.getPrimitiveById(id); 175 if (osm != null && osm.isDeleted()) { 176 del.add(id); 177 } 178 } 179 if (!del.isEmpty()) { 180 SwingUtilities.invokeLater(new Runnable() { 181 @Override 182 public void run() { 183 reportProblemDialog(del, 184 trn("Object deleted", "Objects deleted", del.size()), 185 trn( 186 "One downloaded object is deleted.", 187 "{0} downloaded objects are deleted.", 188 del.size(), 189 del.size()), 190 null, 191 JOptionPane.WARNING_MESSAGE 192 ).showDialog(); 193 } 194 }); 195 } 196 } 197 }); 198 } 199 200 private static ExtendedDialog reportProblemDialog(Set<PrimitiveId> errs, 201 String TITLE, String TEXT, String LIST_LABEL, int msgType) { 202 JPanel p = new JPanel(new GridBagLayout()); 203 p.add(new HtmlPanel(TEXT), GBC.eop()); 204 if (LIST_LABEL != null) { 205 JLabel missing = new JLabel(LIST_LABEL); 206 missing.setFont(missing.getFont().deriveFont(Font.PLAIN)); 207 p.add(missing, GBC.eol()); 208 } 209 JosmTextArea txt = new JosmTextArea(); 210 txt.setFont(new Font("Monospaced", txt.getFont().getStyle(), txt.getFont().getSize())); 211 txt.setEditable(false); 212 txt.setBackground(p.getBackground()); 213 txt.setColumns(40); 214 txt.setRows(1); 215 txt.setText(Utils.join(", ", errs)); 216 JScrollPane scroll = new JScrollPane(txt); 217 p.add(scroll, GBC.eop().weight(1.0, 0.0).fill(GBC.HORIZONTAL)); 218 219 return new ExtendedDialog( 220 Main.parent, 221 TITLE, 222 new String[] { tr("Ok") }) 223 .setButtonIcons(new String[] { "ok" }) 224 .setIcon(msgType) 225 .setContent(p, false); 226 } 227 } 228 No newline at end of file -
src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java
diff --git src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java index 9f4e0cc..3bb505e 100644
import java.util.LinkedList; 7 7 import java.util.List; 8 8 9 9 import org.openstreetmap.josm.Main; 10 import org.openstreetmap.josm.actions.DownloadPrimitiveAction;11 10 import org.openstreetmap.josm.data.osm.PrimitiveId; 12 11 import org.openstreetmap.josm.data.osm.SimplePrimitiveId; 13 import org.openstreetmap.josm.gui. util.GuiHelper;12 import org.openstreetmap.josm.gui.io.DownloadPrimitivesWithReferrersTask; 14 13 import org.openstreetmap.josm.io.remotecontrol.AddTagsDialog; 15 14 import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault; 16 15 … … public class LoadObjectHandler extends RequestHandler { 32 31 public String[] getMandatoryParams() { 33 32 return new String[]{"objects"}; 34 33 } 35 34 36 35 @Override 37 36 public String[] getOptionalParams() { 38 37 return new String[] {"new_layer", "addtags", "relation_members", "referrers"}; … … public class LoadObjectHandler extends RequestHandler { 60 59 final boolean newLayer = isLoadInNewLayer(); 61 60 final boolean relationMembers = Boolean.parseBoolean(args.get("relation_members")); 62 61 final boolean referrers = args.containsKey("referrers") ? Boolean.parseBoolean(args.get("referrers")) : true; 63 GuiHelper.runInEDTAndWait(new Runnable() { 64 @Override public void run() { 65 DownloadPrimitiveAction.processItems(newLayer, ps, referrers, relationMembers); 66 } 67 }); 68 GuiHelper.executeByMainWorkerInEDT(new Runnable() { 62 DownloadPrimitivesWithReferrersTask task = new DownloadPrimitivesWithReferrersTask( 63 newLayer, ps, referrers, relationMembers, null); 64 Main.worker.submit(task); 65 Main.worker.submit(new Runnable() { 69 66 @Override 70 67 public void run() { 71 Main.main.getCurrentDataSet().setSelected(ps);68 System.out.println("task done"); 72 69 AddTagsDialog.addTags(args, sender); 73 70 ps.clear(); 74 71 }