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 Balaitous, 9 years ago)

Draft of current work

  • 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; 
    33
    44import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
    55import static org.openstreetmap.josm.tools.I18n.tr;
    6 import static org.openstreetmap.josm.tools.I18n.trn;
    76
    8 import java.awt.Font;
    9 import java.awt.GridBagLayout;
    107import java.awt.event.ActionEvent;
    118import java.awt.event.KeyEvent;
    12 import java.lang.reflect.InvocationTargetException;
    139import 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;
    2210
    2311import 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;
    2712import org.openstreetmap.josm.data.osm.PrimitiveId;
    28 import org.openstreetmap.josm.gui.ExtendedDialog;
    2913import 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;
     14import org.openstreetmap.josm.gui.io.DownloadPrimitivesWithReferrersTask;
    3515import org.openstreetmap.josm.tools.Shortcut;
    36 import org.openstreetmap.josm.tools.Utils;
    3716
    3817/**
    3918 * Download an OsmPrimitive by specifying type and ID
    public class DownloadPrimitiveAction extends JosmAction { 
    6241
    6342    /**
    6443     * @param newLayer if the data should be downloaded into a new layer
    65      * @param ids
     44     * @param ids List of primitive id to download
    6645     * @param downloadReferrers if the referrers of the object should be downloaded as well, i.e., parent relations, and for nodes, additionally, parent ways
    6746     * @param full if the members of a relation should be downloaded as well
    6847     */
    6948    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");
    8350
    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);
    14254
    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");
    15156        }
    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));
    16157
    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     }
    17058}
  • 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 { 
    130130     *
    131131     */
    132132    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 &lt;= 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*/);
    134149        CheckParameterUtil.ensureParameterNotNull(targetLayer, "targetLayer");
    135150        if (primitiveId.isNew())
    136151            throw new IllegalArgumentException(MessageFormat.format("Cannot download referrers for new primitives (ID {0})", primitiveId.getUniqueId()));
    public class DownloadReferrersTask extends PleaseWaitRunnable { 
    167182                    @Override
    168183                    public void run() {
    169184                        targetLayer.onPostDownloadFromServer();
    170                         Main.map.mapView.repaint();
     185                        if(Main.map != null)
     186                            Main.map.mapView.repaint();
    171187                    }
    172188                }
    173189        );
  • 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; 
    88import java.util.List;
    99import java.util.Set;
    1010
     11import org.openstreetmap.josm.Main;
    1112import org.openstreetmap.josm.actions.AutoScaleAction;
    1213import org.openstreetmap.josm.data.osm.DataSet;
    1314import org.openstreetmap.josm.data.osm.DataSetMerger;
    public class DownloadPrimitivesTask extends PleaseWaitRunnable { 
    5152     * @throws IllegalArgumentException thrown if layer is null.
    5253     */
    5354    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 */);
    5572        ensureParameterNotNull(layer, "layer");
    5673        this.ids = ids;
    5774        this.layer = layer;
    public class DownloadPrimitivesTask extends PleaseWaitRunnable { 
    83100            @Override
    84101            public void run() {
    85102                layer.mergeFrom(ds);
    86                 AutoScaleAction.zoomTo(ds.allPrimitives());
     103                if(Main.map != null)
     104                    AutoScaleAction.zoomTo(ds.allPrimitives());
    87105                layer.onPostDownloadFromServer();
    88106            }
    89107        });
  • 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
    - +  
     1package org.openstreetmap.josm.gui.io;
     2
     3import static org.openstreetmap.josm.tools.I18n.tr;
     4import static org.openstreetmap.josm.tools.I18n.trn;
     5
     6import java.awt.Font;
     7import java.awt.GridBagLayout;
     8import java.io.IOException;
     9import java.lang.reflect.InvocationTargetException;
     10import java.util.List;
     11import java.util.Set;
     12import java.util.TreeSet;
     13
     14import javax.swing.JLabel;
     15import javax.swing.JOptionPane;
     16import javax.swing.JPanel;
     17import javax.swing.JScrollPane;
     18import javax.swing.SwingUtilities;
     19
     20import org.openstreetmap.josm.Main;
     21import org.openstreetmap.josm.actions.downloadtasks.DownloadReferrersTask;
     22import org.openstreetmap.josm.data.osm.DataSet;
     23import org.openstreetmap.josm.data.osm.OsmPrimitive;
     24import org.openstreetmap.josm.data.osm.PrimitiveId;
     25import org.openstreetmap.josm.gui.ExtendedDialog;
     26import org.openstreetmap.josm.gui.PleaseWaitRunnable;
     27import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     28import org.openstreetmap.josm.gui.widgets.HtmlPanel;
     29import org.openstreetmap.josm.gui.widgets.JosmTextArea;
     30import org.openstreetmap.josm.io.OsmTransferException;
     31import org.openstreetmap.josm.tools.GBC;
     32import org.openstreetmap.josm.tools.Utils;
     33import org.xml.sax.SAXException;
     34
     35/**
     36 * Task for downloading a set of primitives with all referrers.
     37 */
     38public 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