Ignore:
Timestamp:
2009-09-07T23:06:19+02:00 (17 years ago)
Author:
Gubaer
Message:

Had to replace DataSet:getPrimitiveById(id) with DataSet:getPrimitiveById(id,type). Primitive ids are not globally unique, only per type of primitive.
Fixed problems in unit test, available unit tests passing again.

Location:
trunk/src/org/openstreetmap/josm/actions
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java

    r2025 r2077  
    1616import org.openstreetmap.josm.data.osm.Node;
    1717import org.openstreetmap.josm.data.osm.OsmPrimitive;
     18import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    1819import org.openstreetmap.josm.data.osm.Relation;
    1920import org.openstreetmap.josm.data.osm.Way;
     
    3940     * @param id the primitive id
    4041     */
    41     protected void handlePrimitiveGoneException(long id) {
     42    protected void handlePrimitiveGoneException(long id, OsmPrimitiveType type) {
    4243        MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
    43         reader.append(getCurrentDataSet(),id);
     44        reader.append(getCurrentDataSet(),id, type);
    4445        DataSet ds = null;
    4546        try {
     
    7374     *
    7475     */
    75     public void updatePrimitive(long id) throws IllegalStateException{
     76    public void updatePrimitive(OsmPrimitiveType type, long id) throws IllegalStateException{
    7677        if (getEditLayer() == null)
    7778            throw new IllegalStateException(tr("No current dataset found"));
    78         OsmPrimitive primitive = getEditLayer().data.getPrimitiveById(id);
     79        OsmPrimitive primitive = getEditLayer().data.getPrimitiveById(id, type);
    7980        if (primitive == null)
    8081            throw new IllegalStateException(tr("Didn't find a primitive with id {0} in the current dataset", id));
  • trunk/src/org/openstreetmap/josm/actions/UploadAction.java

    r2074 r2077  
    4141import org.openstreetmap.josm.data.osm.DataSet;
    4242import org.openstreetmap.josm.data.osm.OsmPrimitive;
     43import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    4344import org.openstreetmap.josm.gui.ExceptionDialogUtil;
    4445import org.openstreetmap.josm.gui.ExtendedDialog;
     
    191192     * @param id the primitive ID
    192193     */
    193     protected void synchronizePrimitive(final String id) {
    194         Main.worker.execute(new UpdatePrimitiveTask(Long.parseLong(id)));
     194    protected void synchronizePrimitive(final OsmPrimitiveType type, final long id) {
     195        Main.worker.execute(new UpdatePrimitiveTask(type, id));
    195196    }
    196197
     
    217218     * @param myVersion  the version of the primitive in the local dataset
    218219     */
    219     protected void handleUploadConflictForKnownConflict(String primitiveType, String id, String serverVersion, String myVersion) {
     220    protected void handleUploadConflictForKnownConflict(OsmPrimitiveType primitiveType, long id, String serverVersion, String myVersion) {
    220221        Object[] options = new Object[] {
    221                 tr("Synchronize {0} {1} only", tr(primitiveType), id),
     222                tr("Synchronize {0} {1} only", tr(primitiveType.getAPIName()), id),
    222223                tr("Synchronize entire dataset"),
    223224                tr("Cancel")
     
    232233                + "Click <strong>{5}</strong> to synchronize the entire local dataset with the server.<br>"
    233234                + "Click <strong>{6}</strong> to abort and continue editing.<br></html>",
    234                 tr(primitiveType), id, serverVersion, myVersion,
     235                tr(primitiveType.getAPIName()), id, serverVersion, myVersion,
    235236                options[0], options[1], options[2]
    236237        );
     
    247248        );
    248249        switch(ret) {
    249             case JOptionPane.CLOSED_OPTION: return;
    250             case JOptionPane.CANCEL_OPTION: return;
    251             case 0: synchronizePrimitive(id); break;
    252             case 1: synchronizeDataSet(); break;
    253             default:
    254                 // should not happen
    255                 throw new IllegalStateException(tr("unexpected return value. Got {0}", ret));
     250        case JOptionPane.CLOSED_OPTION: return;
     251        case JOptionPane.CANCEL_OPTION: return;
     252        case 0: synchronizePrimitive(primitiveType, id); break;
     253        case 1: synchronizeDataSet(); break;
     254        default:
     255            // should not happen
     256            throw new IllegalStateException(tr("unexpected return value. Got {0}", ret));
    256257        }
    257258    }
     
    287288        );
    288289        switch(ret) {
    289             case JOptionPane.CLOSED_OPTION: return;
    290             case 1: return;
    291             case 0: synchronizeDataSet(); break;
    292             default:
    293                 // should not happen
    294                 throw new IllegalStateException(tr("unexpected return value. Got {0}", ret));
     290        case JOptionPane.CLOSED_OPTION: return;
     291        case 1: return;
     292        case 0: synchronizeDataSet(); break;
     293        default:
     294            // should not happen
     295            throw new IllegalStateException(tr("unexpected return value. Got {0}", ret));
    295296        }
    296297    }
     
    306307        Matcher m = p.matcher(e.getErrorHeader());
    307308        if (m.matches()) {
    308             handleUploadConflictForKnownConflict(m.group(3), m.group(4), m.group(2),m.group(1));
     309            handleUploadConflictForKnownConflict(OsmPrimitiveType.from(m.group(3)), Long.parseLong(m.group(4)), m.group(2),m.group(1));
    309310        } else {
    310311            logger.warning(tr("Warning: error header \"{0}\" did not match expected pattern \"{1}\"", e.getErrorHeader(),pattern));
     
    326327     * @see UpdateSelectionAction#handlePrimitiveGoneException(long)
    327328     */
    328     protected void handleGoneForKnownPrimitive(String primitiveType, String id) {
     329    protected void handleGoneForKnownPrimitive(OsmPrimitiveType primitiveType, String id) {
    329330        UpdateSelectionAction act = new UpdateSelectionAction();
    330         act.handlePrimitiveGoneException(Long.parseLong(id));
     331        act.handlePrimitiveGoneException(Long.parseLong(id),primitiveType);
    331332    }
    332333
     
    344345        Matcher m = p.matcher(e.getErrorHeader());
    345346        if (m.matches()) {
    346             handleGoneForKnownPrimitive(m.group(1), m.group(2));
     347            handleGoneForKnownPrimitive(OsmPrimitiveType.from(m.group(1)), m.group(2));
    347348        } else {
    348349            logger.warning(tr("Error header \"{0}\" does not match expected pattern \"{1}\"",e.getErrorHeader(), pattern));
     
    424425        private Exception lastException = null;
    425426        private long id;
    426 
    427         public UpdatePrimitiveTask(long id) {
     427        private OsmPrimitiveType type;
     428
     429        public UpdatePrimitiveTask(OsmPrimitiveType type, long id) {
    428430            super(tr("Updating primitive"),false /* don't ignore exceptions */);
    429431            this.id = id;
     432            this.type = type;
    430433        }
    431434
     
    433436            try {
    434437                UpdateSelectionAction act = new UpdateSelectionAction();
    435                 act.updatePrimitive(id);
     438                act.updatePrimitive(type, id);
    436439            } catch (Exception sxe) {
    437440                if (uploadCancelled) {
  • trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTaskList.java

    r2017 r2077  
    125125        final OsmDataLayer editLayer = Main.map.mapView.getEditLayer();
    126126        if (editLayer != null) {
    127             Set<Long> myPrimitiveIds = editLayer.data.getCompletePrimitiveIds();
    128             Set<Long> downloadedIds = getDownloadedIds();
    129             myPrimitiveIds.removeAll(downloadedIds);
    130             myPrimitiveIds.remove(new Long(0)); // ignore new primitives
    131             if (! myPrimitiveIds.isEmpty()) {
    132                 handlePotentiallyDeletedPrimitives(myPrimitiveIds);
    133             }
    134         }
     127            Set<OsmPrimitive> myPrimitives = getCompletePrimitives(editLayer.data);
     128            for (DownloadTask task : osmTasks) {
     129                if(task instanceof DownloadOsmTask) {
     130                    DataSet ds = ((DownloadOsmTask)task).getDownloadedData();
     131                    if (ds != null) {
     132                        myPrimitives.removeAll(ds.nodes);
     133                        myPrimitives.removeAll(ds.ways);
     134                        myPrimitives.removeAll(ds.relations);
     135                    }
     136                }
     137            }
     138            if (! myPrimitives.isEmpty()) {
     139                handlePotentiallyDeletedPrimitives(myPrimitives);
     140            }
     141        }
     142    }
     143
     144
     145    /**
     146     * Replies the set of ids of all complete primitives (i.e. those with
     147     * ! primitive.incomplete)
     148     *
     149     * @return the set of ids of all complete primitives
     150     */
     151    protected Set<OsmPrimitive> getCompletePrimitives(DataSet ds) {
     152        HashSet<OsmPrimitive> ret = new HashSet<OsmPrimitive>();
     153        for (OsmPrimitive primitive : ds.nodes) {
     154            if (!primitive.incomplete && primitive.getId() == 0) {
     155                ret.add(primitive);
     156            }
     157        }
     158        for (OsmPrimitive primitive : ds.ways) {
     159            if (! primitive.incomplete && primitive.getId() == 0) {
     160                ret.add(primitive);
     161            }
     162        }
     163        for (OsmPrimitive primitive : ds.relations) {
     164            if (! primitive.incomplete && primitive.getId() == 0) {
     165                ret.add(primitive);;
     166            }
     167        }
     168        return ret;
    135169    }
    136170
     
    141175     * @param potentiallyDeleted a set of ids to check update from the server
    142176     */
    143     protected void updatePotentiallyDeletedPrimitives(Set<Long> potentiallyDeleted) {
    144         DataSet ds =  Main.map.mapView.getEditLayer().data;
     177    protected void updatePotentiallyDeletedPrimitives(Set<OsmPrimitive> potentiallyDeleted) {
    145178        final ArrayList<OsmPrimitive> toSelect = new ArrayList<OsmPrimitive>();
    146         for (Long id : potentiallyDeleted) {
    147             OsmPrimitive primitive = ds.getPrimitiveById(id);
     179        for (OsmPrimitive primitive : potentiallyDeleted) {
    148180            if (primitive != null) {
    149181                toSelect.add(primitive);
     
    167199     * @param potentiallyDeleted a set of primitives (given by their ids)
    168200     */
    169     protected void handlePotentiallyDeletedPrimitives(Set<Long> potentiallyDeleted) {
     201    protected void handlePotentiallyDeletedPrimitives(Set<OsmPrimitive> potentiallyDeleted) {
    170202        String [] options = {
    171203                "Check on the server",
     
    197229        );
    198230        switch(ret) {
    199             case JOptionPane.CLOSED_OPTION: return;
    200             case JOptionPane.NO_OPTION: return;
    201             case JOptionPane.YES_OPTION: updatePotentiallyDeletedPrimitives(potentiallyDeleted); break;
    202         }
    203     }
    204 
    205     /**
    206      * replies true, if the primitive with id <code>id</code> was downloaded into the
    207      * dataset <code>ds</code>
    208      *
    209      * @param id the id
    210      * @param ds the dataset
    211      * @return true, if the primitive with id <code>id</code> was downloaded into the
    212      * dataset <code>ds</code>; false otherwise
    213      */
    214     protected boolean wasDownloaded(long id, DataSet ds) {
    215         OsmPrimitive primitive = ds.getPrimitiveById(id);
    216         return primitive != null;
    217     }
    218 
    219     /**
    220      * replies true, if the primitive with id <code>id</code> was downloaded into the
    221      * dataset of one of the download tasks
    222      *
    223      * @param id the id
    224      * @return true, if the primitive with id <code>id</code> was downloaded into the
    225      * dataset of one of the download tasks
    226      *
    227      */
    228     public boolean wasDownloaded(long id) {
    229         for (DownloadTask task : osmTasks) {
    230             if(task instanceof DownloadOsmTask) {
    231                 DataSet ds = ((DownloadOsmTask)task).getDownloadedData();
    232                 if(wasDownloaded(id,ds)) return true;
    233             }
    234         }
    235         return false;
     231        case JOptionPane.CLOSED_OPTION: return;
     232        case JOptionPane.NO_OPTION: return;
     233        case JOptionPane.YES_OPTION: updatePotentiallyDeletedPrimitives(potentiallyDeleted); break;
     234        }
    236235    }
    237236
     
    241240     * @return the set of primitive ids which have been downloaded by this task list
    242241     */
    243     public Set<Long> getDownloadedIds() {
    244         HashSet<Long> ret = new HashSet<Long>();
     242    public Set<OsmPrimitive> getDownloadedPrimitives() {
     243        HashSet<OsmPrimitive> ret = new HashSet<OsmPrimitive>();
    245244        for (DownloadTask task : osmTasks) {
    246245            if(task instanceof DownloadOsmTask) {
    247246                DataSet ds = ((DownloadOsmTask)task).getDownloadedData();
    248247                if (ds != null) {
    249                     ret.addAll(ds.getPrimitiveIds());
     248                    ret.addAll(ds.nodes);
     249                    ret.addAll(ds.ways);
     250                    ret.addAll(ds.relations);
    250251                }
    251252            }
Note: See TracChangeset for help on using the changeset viewer.