Ticket #9634: ticket9634_2014-04-10_00:46:09_+0200.patch
File ticket9634_2014-04-10_00:46:09_+0200.patch, 20.3 KB (added by , 9 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..ef30748 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); 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..6d7279f
- + 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.widgets.HtmlPanel; 29 import org.openstreetmap.josm.gui.widgets.JosmTextArea; 30 import org.openstreetmap.josm.io.OsmTransferException; 31 import org.openstreetmap.josm.tools.GBC; 32 import org.openstreetmap.josm.tools.Utils; 33 import org.xml.sax.SAXException; 34 35 /** 36 * Task for downloading a set of primitives with all referrers. 37 */ 38 public class DownloadPrimitivesWithReferrersTask extends PleaseWaitRunnable { 39 private OsmDataLayer tmpLayer; 40 private List<PrimitiveId> ids; 41 private boolean full; 42 private boolean downloadReferrers; 43 private DownloadPrimitivesTask mainTask; 44 private boolean canceled = false; 45 private boolean newLayer; 46 private PleaseWaitRunnable currentTask = null; 47 48 /** 49 * Constructor 50 * 51 * @param newLayer if the data should be downloaded into a new layer 52 * @param ids List of primitive id to download 53 * @param downloadReferrers if the referrers of the object should be downloaded as well, 54 * i.e., parent relations, and for nodes, additionally, parent ways 55 * @param full if the members of a relation should be downloaded as well 56 */ 57 public DownloadPrimitivesWithReferrersTask(boolean newLayer, List<PrimitiveId> ids, boolean downloadReferrers, 58 boolean full) { //, ProgressMonitor monitor) { 59 super(tr("Download objects"), false); 60 this.ids = ids; 61 this.downloadReferrers = downloadReferrers; 62 this.full = full; 63 OsmDataLayer layer = Main.main.getEditLayer(); 64 this.newLayer = (layer == null) || newLayer; 65 // All downloaded primitives are put in a tmpLayer 66 tmpLayer = new OsmDataLayer(new DataSet(), OsmDataLayer.createNewName(), null); 67 //Main.main.addLayer(tmpLayer); 68 } 69 70 @Override 71 protected void cancel() { 72 canceled = true; 73 /* 74 synchronized(this) { 75 if(currentTask != null) 76 currentTask.cancel(); 77 } 78 */ 79 } 80 81 @Override 82 protected void realRun() throws SAXException, IOException, OsmTransferException { 83 getProgressMonitor().setTicksCount(ids.size()+1); 84 // First, download primitives 85 mainTask = new DownloadPrimitivesTask(tmpLayer, ids, full, getProgressMonitor().createSubTaskMonitor(1, false)); 86 currentTask = mainTask; 87 synchronized(this) { 88 if(canceled) 89 return; 90 } 91 mainTask.run(); 92 // Then, download referrers for each primitive 93 if(downloadReferrers) 94 for(PrimitiveId id : ids) { 95 System.out.printf("referrers task %s\n", id.toString()); 96 currentTask = new DownloadReferrersTask( 97 tmpLayer, id, getProgressMonitor().createSubTaskMonitor(1, false)); 98 synchronized(this) { 99 if(canceled) 100 return; 101 } 102 currentTask.run(); 103 } 104 } 105 106 @Override 107 protected void finish() { 108 if(canceled) 109 return; 110 OsmDataLayer editLayer = Main.main.getEditLayer(); 111 if(editLayer == null || this.newLayer) { 112 Main.main.addLayer(tmpLayer); 113 } else { 114 editLayer.mergeFrom(tmpLayer); 115 } 116 showErrorsAndWarnings(); 117 } 118 119 private void showErrorsAndWarnings() { 120 // FIXME: Does all task are really finish ? 121 System.out.printf("call to finish\n"); 122 Main.worker.submit(new Runnable() { 123 @Override 124 public void run() { 125 final Set<PrimitiveId> errs = mainTask.getMissingPrimitives(); 126 if (errs != null && !errs.isEmpty()) { 127 try { 128 SwingUtilities.invokeAndWait(new Runnable() { 129 @Override 130 public void run() { 131 reportProblemDialog(errs, 132 trn("Object could not be downloaded", "Some objects could not be downloaded", errs.size()), 133 trn("One object could not be downloaded.<br>", 134 "{0} objects could not be downloaded.<br>", 135 errs.size(), 136 errs.size()) 137 + tr("The server replied with response code 404.<br>" 138 + "This usually means, the server does not know an object with the requested id."), 139 tr("missing objects:"), 140 JOptionPane.ERROR_MESSAGE 141 ).showDialog(); 142 } 143 }); 144 } catch (InterruptedException ex) { 145 Main.warn("InterruptedException while displaying error dialog"); 146 } catch (InvocationTargetException ex) { 147 Main.warn(ex); 148 } 149 } 150 151 final Set<PrimitiveId> del = new TreeSet<PrimitiveId>(); 152 DataSet ds = Main.main.getCurrentDataSet(); 153 for (PrimitiveId id : ids) { 154 OsmPrimitive osm = ds.getPrimitiveById(id); 155 if (osm != null && osm.isDeleted()) { 156 del.add(id); 157 } 158 } 159 if (!del.isEmpty()) { 160 SwingUtilities.invokeLater(new Runnable() { 161 @Override 162 public void run() { 163 reportProblemDialog(del, 164 trn("Object deleted", "Objects deleted", del.size()), 165 trn( 166 "One downloaded object is deleted.", 167 "{0} downloaded objects are deleted.", 168 del.size(), 169 del.size()), 170 null, 171 JOptionPane.WARNING_MESSAGE 172 ).showDialog(); 173 } 174 }); 175 } 176 } 177 }); 178 } 179 180 private static ExtendedDialog reportProblemDialog(Set<PrimitiveId> errs, 181 String TITLE, String TEXT, String LIST_LABEL, int msgType) { 182 JPanel p = new JPanel(new GridBagLayout()); 183 p.add(new HtmlPanel(TEXT), GBC.eop()); 184 if (LIST_LABEL != null) { 185 JLabel missing = new JLabel(LIST_LABEL); 186 missing.setFont(missing.getFont().deriveFont(Font.PLAIN)); 187 p.add(missing, GBC.eol()); 188 } 189 JosmTextArea txt = new JosmTextArea(); 190 txt.setFont(new Font("Monospaced", txt.getFont().getStyle(), txt.getFont().getSize())); 191 txt.setEditable(false); 192 txt.setBackground(p.getBackground()); 193 txt.setColumns(40); 194 txt.setRows(1); 195 txt.setText(Utils.join(", ", errs)); 196 JScrollPane scroll = new JScrollPane(txt); 197 p.add(scroll, GBC.eop().weight(1.0, 0.0).fill(GBC.HORIZONTAL)); 198 199 return new ExtendedDialog( 200 Main.parent, 201 TITLE, 202 new String[] { tr("Ok") }) 203 .setButtonIcons(new String[] { "ok" }) 204 .setIcon(msgType) 205 .setContent(p, false); 206 } 207 } 208 No newline at end of file