Ignore:
Timestamp:
2009-06-15T20:22:46+02:00 (16 years ago)
Author:
Gubaer
Message:

fixed: bug in OsmApi.getOsmApi()
cleanup: exception handling in interfacing with OSM API
new: new action for updating individual elements with the their current state on the server (including new menu item in the file menu)
new: improved user feedback in case of conflicts
new: handles 410 Gone conflicts when uploading a changeset
new: undoable command for "purging" a primitive from the current dataset (necessary if the primitive is already deleted on the server and the user wants to remove it from its local dataset)
new: undoable command for "undeleting" an already deleted primitive on the server (kind of "cloning")
new: after a full upload, checks whether there are primitives in the local dataset which might be deleted on the server.
new: data structures for history data
new: history download support in io package

Location:
trunk/src/org/openstreetmap/josm/gui
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/MainMenu.java

    r1639 r1670  
    6262import org.openstreetmap.josm.actions.UnselectAllAction;
    6363import org.openstreetmap.josm.actions.UpdateDataAction;
     64import org.openstreetmap.josm.actions.UpdateSelectionAction;
    6465import org.openstreetmap.josm.actions.UploadAction;
    6566import org.openstreetmap.josm.actions.ZoomInAction;
     
    9495    public final DownloadAction download = new DownloadAction();
    9596    public final JosmAction update = new UpdateDataAction();
     97    public final JosmAction updateSelection = new UpdateSelectionAction();
    9698    public final JosmAction upload = new UploadAction();
    9799    public final JosmAction exit = new ExitAction();
     
    194196        add(fileMenu, upload);
    195197        add(fileMenu, update);
     198        add(fileMenu, updateSelection);
    196199        fileMenu.addSeparator();
    197200        add(fileMenu, exit);
  • trunk/src/org/openstreetmap/josm/gui/PleaseWaitRunnable.java

    r1647 r1670  
    1717
    1818import org.openstreetmap.josm.Main;
     19import org.openstreetmap.josm.io.OsmTransferException;
    1920import org.xml.sax.SAXException;
    2021
     
    109110                x.printStackTrace();
    110111                errorMessage = x.getMessage();
     112            } catch(OsmTransferException x) {
     113                x.printStackTrace();
     114                if (x.getCause() != null) {
     115                    errorMessage = x.getCause().getMessage();
     116                } else {
     117                    errorMessage = x.getMessage();
     118                }
    111119            } finally {
    112120                closeDialog();
     
    134142     * is called. finish() is called in any case.
    135143     */
    136     protected abstract void realRun() throws SAXException, IOException;
     144    protected abstract void realRun() throws SAXException, IOException, OsmTransferException;
    137145
    138146    /**
     
    158166                        Main.pleaseWaitDlg.dispose();
    159167                    }
    160                     if (errorMessage != null && !silent)
     168                    if (errorMessage != null && !silent) {
    161169                        JOptionPane.showMessageDialog(Main.parent, errorMessage);
     170                    }
    162171                }
    163172            };
    164173
    165174            // make sure, this is called in the dispatcher thread ASAP
    166             if (EventQueue.isDispatchThread())
     175            if (EventQueue.isDispatchThread()) {
    167176                runnable.run();
    168             else
     177            } else {
    169178                EventQueue.invokeAndWait(runnable);
     179            }
    170180
    171181        } catch (InterruptedException e) {
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java

    r1624 r1670  
    3636import org.openstreetmap.josm.data.osm.Node;
    3737import org.openstreetmap.josm.data.osm.OsmPrimitive;
     38import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    3839import org.openstreetmap.josm.data.osm.Relation;
    3940import org.openstreetmap.josm.data.osm.RelationMember;
     
    4445import org.openstreetmap.josm.gui.dialogs.ConflictDialog;
    4546import org.openstreetmap.josm.io.OsmServerObjectReader;
     47import org.openstreetmap.josm.io.OsmTransferException;
    4648import org.openstreetmap.josm.tools.GBC;
    4749import org.openstreetmap.josm.tools.Shortcut;
     
    145147                            String key = propertyData.getValueAt(i, 0).toString();
    146148                            String value = propertyData.getValueAt(i, 1).toString();
    147                             if (key.length() > 0 && value.length() > 0) clone.put(key, value);
     149                            if (key.length() > 0 && value.length() > 0) {
     150                                clone.put(key, value);
     151                            }
    148152                        }
    149153                        refreshTables();
     
    175179                {
    176180                    sel = new ArrayList<OsmPrimitive>(cnt);
    177                     for (int i : memberTable.getSelectedRows())
     181                    for (int i : memberTable.getSelectedRows()) {
    178182                        sel.add((OsmPrimitive)memberTable.getValueAt(i, 1));
     183                    }
    179184                }
    180185                else
     
    182187                    cnt = memberTable.getRowCount();
    183188                    sel = new ArrayList<OsmPrimitive>(cnt);
    184                     for (int i = 0; i < cnt; ++i)
     189                    for (int i = 0; i < cnt; ++i) {
    185190                        sel.add((OsmPrimitive)memberTable.getValueAt(i, 1));
     191                    }
    186192                }
    187193                Main.ds.setSelected(sel);
     
    239245
    240246        buttonPanel.add(createButton(marktr("Add Selected"),"addselected",
    241         tr("Add all currently selected objects as members"), KeyEvent.VK_D, new ActionListener() {
     247                tr("Add all currently selected objects as members"), KeyEvent.VK_D, new ActionListener() {
    242248            public void actionPerformed(ActionEvent e) {
    243249                addSelected();
     
    246252
    247253        buttonPanel.add(createButton(marktr("Remove Selected"),"removeselected",
    248         tr("Remove all currently selected objects from relation"), KeyEvent.VK_S, new ActionListener() {
     254                tr("Remove all currently selected objects from relation"), KeyEvent.VK_S, new ActionListener() {
    249255            public void actionPerformed(ActionEvent e) {
    250256                deleteSelected();
     
    259265
    260266        buttonPanel.add(createButton(marktr("Remove"),"remove",
    261         tr("Remove the member in the current table row from this relation"), KeyEvent.VK_M, new ActionListener() {
     267                tr("Remove the member in the current table row from this relation"), KeyEvent.VK_M, new ActionListener() {
    262268            public void actionPerformed(ActionEvent e) {
    263269                int[] rows = memberTable.getSelectedRows();
     
    273279
    274280        buttonPanel.add(createButton(marktr("Download Members"),"downloadincomplete",
    275         tr("Download all incomplete ways and nodes in relation"), KeyEvent.VK_K, new ActionListener() {
     281                tr("Download all incomplete ways and nodes in relation"), KeyEvent.VK_K, new ActionListener() {
    276282            public void actionPerformed(ActionEvent e) {
    277283                downloadRelationMembers();
     
    303309    protected void buttonAction(ActionEvent evt) {
    304310        String a = evt.getActionCommand();
    305         if(applyChangesText.equals(a))
     311        if(applyChangesText.equals(a)) {
    306312            applyChanges();
     313        }
    307314
    308315        setVisible(false);
     
    348355                    break;
    349356                } else if (m.member instanceof Relation) {
    350                     if (m.member == this.relation)
     357                    if (m.member == this.relation) {
    351358                        break;
     359                    }
    352360                    m = ((Relation)m.member).lastMember();
    353361                    depth++;
     
    366374                            break;
    367375                        } else if (m.member instanceof Relation) {
    368                             if (m.member == this.relation)
     376                            if (m.member == this.relation) {
    369377                                break;
     378                            }
    370379                            m = ((Relation)(m.member)).firstMember();
    371380                            depth++;
     
    374383                        }
    375384                    }
    376                     if (way2 != null)
     385                    if (way2 != null) {
    377386                        break;
     387                    }
    378388                }
    379389            }
     
    404414                }
    405415
    406                 // end of section to determine linkedness. 
     416                // end of section to determine linkedness.
    407417
    408418                memberData.addRow(new Object[]{em.role, em.member, linked ? tr("yes") : tr("no")});
     
    416426    private SideButton createButton(String name, String iconName, String tooltip, int mnemonic, ActionListener actionListener) {
    417427        return
    418             new SideButton(name, iconName, "relationEditor",
     428        new SideButton(name, iconName, "relationEditor",
    419429                tooltip,
    420430                Shortcut.registerShortcut("relationeditor:"+iconName,
     
    422432                        mnemonic,
    423433                        Shortcut.GROUP_MNEMONIC),
    424                 actionListener
    425             );
     434                        actionListener
     435        );
    426436    }
    427437
     
    483493        for (RelationMember rm : clone.members) {
    484494            if (rm != null) {
    485                 while (m[i] != null) i++;
     495                while (m[i] != null) {
     496                    i++;
     497                }
    486498                m[i++] = rm;
    487499            }
     
    509521        }
    510522        if (download) {
    511             OsmServerObjectReader reader = new OsmServerObjectReader(clone.id, OsmServerObjectReader.TYPE_REL, true);
     523            OsmServerObjectReader reader = new OsmServerObjectReader(clone.id, OsmPrimitiveType.RELATION, true);
    512524            try {
    513525                DataSet dataSet = reader.parseOsm();
     
    515527                    final MergeVisitor visitor = new MergeVisitor(Main.main
    516528                            .editLayer().data, dataSet);
    517                     for (final OsmPrimitive osm : dataSet.allPrimitives())
     529                    for (final OsmPrimitive osm : dataSet.allPrimitives()) {
    518530                        osm.visit(visitor);
     531                    }
    519532                    visitor.fixReferences();
    520533
    521534                    // copy the merged layer's data source info
    522                     for (DataSource src : dataSet.dataSources)
     535                    for (DataSource src : dataSet.dataSources) {
    523536                        Main.main.editLayer().data.dataSources.add(src);
     537                    }
    524538                    Main.main.editLayer().fireDataChange();
    525539
     
    530544                    JOptionPane.showMessageDialog(Main.parent,
    531545                            tr("There were conflicts during import."));
    532                     if (!dlg.isVisible())
     546                    if (!dlg.isVisible()) {
    533547                        dlg.action
    534                                 .actionPerformed(new ActionEvent(this, 0, ""));
    535                 }
    536 
    537             } catch (SAXException e) {
     548                        .actionPerformed(new ActionEvent(this, 0, ""));
     549                    }
     550                }
     551            } catch(OsmTransferException e) {
    538552                e.printStackTrace();
    539                 JOptionPane.showMessageDialog(this,tr("Error parsing server response.")+": "+e.getMessage(),
    540                 tr("Error"), JOptionPane.ERROR_MESSAGE);
    541             } catch (IOException e) {
    542                 e.printStackTrace();
    543                 JOptionPane.showMessageDialog(this,tr("Cannot connect to server.")+": "+e.getMessage(),
    544                 tr("Error"), JOptionPane.ERROR_MESSAGE);
     553                if (e.getCause() != null) {
     554                    if (e.getCause() instanceof SAXException) {
     555                        JOptionPane.showMessageDialog(this,tr("Error parsing server response.")+": "+e.getCause().getMessage(),
     556                                tr("Error"), JOptionPane.ERROR_MESSAGE);
     557                    } else if(e.getCause() instanceof IOException) {
     558                        JOptionPane.showMessageDialog(this,tr("Cannot connect to server.")+": "+e.getCause().getMessage(),
     559                                tr("Error"), JOptionPane.ERROR_MESSAGE);
     560                    }
     561                } else {
     562                    JOptionPane.showMessageDialog(this,tr("Error when communicating with server.")+": "+e.getMessage(),
     563                            tr("Error"), JOptionPane.ERROR_MESSAGE);
     564                }
    545565            }
    546566        }
  • trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java

    r1646 r1670  
    5151import org.openstreetmap.josm.data.osm.Node;
    5252import org.openstreetmap.josm.data.osm.OsmPrimitive;
     53import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    5354import org.openstreetmap.josm.data.osm.Relation;
    5455import org.openstreetmap.josm.data.osm.Way;
     
    7778        public final int[] normal = new int[3];
    7879        public final int[] deleted = new int[3];
    79         public final String[] names = {"node", "way", "relation"};
     80        public final String[] names = {
     81                OsmPrimitiveType.NODE.getAPIName(),
     82                OsmPrimitiveType.WAY.getAPIName(),
     83                OsmPrimitiveType.RELATION.getAPIName()
     84        };
    8085
    8186        private void inc(final OsmPrimitive osm, final int i) {
    8287            normal[i]++;
    83             if (osm.deleted)
     88            if (osm.deleted) {
    8489                deleted[i]++;
     90            }
    8591        }
    8692
     
    201207
    202208        SimplePaintVisitor painter;
    203         if (Main.pref.getBoolean("draw.wireframe"))
     209        if (Main.pref.getBoolean("draw.wireframe")) {
    204210            painter = new SimplePaintVisitor();
    205         else
     211        } else {
    206212            painter = new MapPaintVisitor();
     213        }
    207214        painter.setGraphics(g);
    208215        painter.setNavigatableComponent(mv);
     
    216223        tool += undeletedSize(data.nodes)+" "+trn("node", "nodes", undeletedSize(data.nodes))+", ";
    217224        tool += undeletedSize(data.ways)+" "+trn("way", "ways", undeletedSize(data.ways));
    218         if (data.version != null) tool += ", " + tr("version {0}", data.version);
     225        if (data.version != null) {
     226            tool += ", " + tr("version {0}", data.version);
     227        }
    219228        File f = getAssociatedFile();
    220         if (f != null)
     229        if (f != null) {
    221230            tool = "<html>"+tool+"<br>"+f.getPath()+"</html>";
     231        }
    222232        return tool;
    223233    }
    224234
    225235    @Override public void mergeFrom(final Layer from) {
    226         final MergeVisitor visitor = new MergeVisitor(data,((OsmDataLayer)from).data);
    227         for (final OsmPrimitive osm : ((OsmDataLayer)from).data.allPrimitives()) {
    228 //            i++;
    229 //            if(i%100 == 0) {
    230 //                double perc = (((double)i) / ((double)max) * 100.0);
    231 //                System.out.format(" " + (int)perc + "%%");
    232 //            }
     236        mergeFrom(((OsmDataLayer)from).data);
     237    }
     238
     239    /**
     240     * merges the primitives in dataset <code>from</code> into the dataset of
     241     * this layer
     242     *
     243     * @param from  the source data set
     244     */
     245    public void mergeFrom(final DataSet from) {
     246        final MergeVisitor visitor = new MergeVisitor(data,from);
     247        for (final OsmPrimitive osm : from.allPrimitives()) {
    233248            osm.visit(visitor);
    234249        }
    235250        visitor.fixReferences();
    236 //        System.out.println("");
    237251
    238252        Area a = data.getDataSourceArea();
    239        
    240         // copy the merged layer's data source info; 
     253
     254        // copy the merged layer's data source info;
    241255        // only add source rectangles if they are not contained in the
    242256        // layer already.
    243         for (DataSource src : ((OsmDataLayer)from).data.dataSources) {
    244             if (a == null || !a.contains(src.bounds.asRect()))
     257        for (DataSource src : from.dataSources) {
     258            if (a == null || !a.contains(src.bounds.asRect())) {
    245259                data.dataSources.add(src);
    246         }
    247        
     260            }
     261        }
     262
    248263        // copy the merged layer's API version, downgrade if required
    249264        if (data.version == null) {
    250             data.version = ((OsmDataLayer)from).data.version;
     265            data.version = from.version;
    251266        } else {
    252             if ("0.5".equals(data.version) ^ "0.5".equals(((OsmDataLayer)from).data.version)) {
    253                 System.err.println("Warning: mixing 0.6 and 0.5 data results in version 0.5");
     267            if ("0.5".equals(data.version) ^ "0.5".equals(from.version)) {
     268                System.err.println(tr("Warning: mixing 0.6 and 0.5 data results in version 0.5"));
    254269                data.version = "0.5";
    255270            }
     
    263278        final ConflictDialog dlg = Main.map.conflictDialog;
    264279        dlg.add(visitor.conflicts);
    265         JOptionPane.showMessageDialog(Main.parent,tr("There were conflicts during import."));
    266         if (!dlg.isVisible())
     280        JOptionPane.showMessageDialog(Main.parent,tr("There were {0} conflicts during import.", visitor.conflicts.size()));
     281        if (!dlg.isVisible()) {
    267282            dlg.action.actionPerformed(new ActionEvent(this, 0, ""));
     283        }
    268284    }
    269285
     
    274290    @Override public void visitBoundingBox(final BoundingXYVisitor v) {
    275291        for (final Node n : data.nodes)
    276             if (!n.deleted && !n.incomplete)
     292            if (!n.deleted && !n.incomplete) {
    277293                v.visit(n);
     294            }
    278295    }
    279296
     
    299316        if (processed != null) {
    300317            final Set<OsmPrimitive> processedSet = new HashSet<OsmPrimitive>(processed);
    301             for (final Iterator<Node> it = data.nodes.iterator(); it.hasNext();)
     318            for (final Iterator<Node> it = data.nodes.iterator(); it.hasNext();) {
    302319                cleanIterator(it, processedSet);
    303             for (final Iterator<Way> it = data.ways.iterator(); it.hasNext();)
     320            }
     321            for (final Iterator<Way> it = data.ways.iterator(); it.hasNext();) {
    304322                cleanIterator(it, processedSet);
    305             for (final Iterator<Relation> it = data.relations.iterator(); it.hasNext();)
     323            }
     324            for (final Iterator<Relation> it = data.relations.iterator(); it.hasNext();) {
    306325                cleanIterator(it, processedSet);
     326            }
    307327        }
    308328
     
    330350            return;
    331351        osm.modified = false;
    332         if (osm.deleted)
     352        if (osm.deleted) {
    333353            it.remove();
     354        }
    334355    }
    335356
     
    342363            return;
    343364        this.modified = modified;
    344         for (final ModifiedChangedListener l : listenerModified)
     365        for (final ModifiedChangedListener l : listenerModified) {
    345366            l.modifiedChanged(modified, this);
     367        }
    346368    }
    347369
     
    352374        int size = 0;
    353375        for (final OsmPrimitive osm : list)
    354             if (!osm.deleted)
     376            if (!osm.deleted) {
    355377                size++;
     378            }
    356379        return size;
    357380    }
     
    359382    @Override public Object getInfoComponent() {
    360383        final DataCountVisitor counter = new DataCountVisitor();
    361         for (final OsmPrimitive osm : data.allPrimitives())
     384        for (final OsmPrimitive osm : data.allPrimitives()) {
    362385            osm.visit(counter);
     386        }
    363387        final JPanel p = new JPanel(new GridBagLayout());
    364388        p.add(new JLabel(tr("{0} consists of:", name)), GBC.eol());
    365389        for (int i = 0; i < counter.normal.length; ++i) {
    366390            String s = counter.normal[i]+" "+trn(counter.names[i],counter.names[i]+"s",counter.normal[i]);
    367             if (counter.deleted[i] > 0)
     391            if (counter.deleted[i] > 0) {
    368392                s += tr(" ({0} deleted.)",counter.deleted[i]);
     393            }
    369394            p.add(new JLabel(s, ImageProvider.get("data", counter.names[i]), JLabel.HORIZONTAL), GBC.eop().insets(15,0,0,0));
    370395        }
     
    375400
    376401    @Override public Component[] getMenuEntries() {
    377         if (Main.applet) {
     402        if (Main.applet)
    378403            return new Component[]{
    379                     new JMenuItem(new LayerListDialog.ShowHideLayerAction(this)),
    380                     new JMenuItem(new LayerListDialog.DeleteLayerAction(this)),
    381                     new JSeparator(),
    382                     new JMenuItem(new RenameLayerAction(getAssociatedFile(), this)),
    383                     new JSeparator(),
    384                     new JMenuItem(new LayerListPopup.InfoAction(this))};
    385         }
     404                new JMenuItem(new LayerListDialog.ShowHideLayerAction(this)),
     405                new JMenuItem(new LayerListDialog.DeleteLayerAction(this)),
     406                new JSeparator(),
     407                new JMenuItem(new RenameLayerAction(getAssociatedFile(), this)),
     408                new JSeparator(),
     409                new JMenuItem(new LayerListPopup.InfoAction(this))};
    386410        return new Component[]{
    387411                new JMenuItem(new LayerListDialog.ShowHideLayerAction(this)),
     
    409433        HashSet<Node> doneNodes = new HashSet<Node>();
    410434        for (Way w : data.ways) {
    411             if (w.incomplete || w.deleted) continue;
     435            if (w.incomplete || w.deleted) {
     436                continue;
     437            }
    412438            GpxTrack trk = new GpxTrack();
    413439            gpxData.tracks.add(trk);
    414440
    415             if (w.get("name") != null)
     441            if (w.get("name") != null) {
    416442                trk.attr.put("name", w.get("name"));
     443            }
    417444
    418445            ArrayList<WayPoint> trkseg = null;
     
    429456                    doneNodes.add(n);
    430457                }
    431                 WayPoint wpt = new WayPoint(n.getCoor());               
     458                WayPoint wpt = new WayPoint(n.getCoor());
    432459                if (!n.isTimestampEmpty())
    433460                {
     
    442469        // records them?
    443470        for (Node n : data.nodes) {
    444             if (n.incomplete || n.deleted || doneNodes.contains(n)) continue;
     471            if (n.incomplete || n.deleted || doneNodes.contains(n)) {
     472                continue;
     473            }
    445474            WayPoint wpt = new WayPoint(n.getCoor());
    446475            if (!n.isTimestampEmpty()) {
Note: See TracChangeset for help on using the changeset viewer.