Ticket #5135: undelete.diff

File undelete.diff, 6.4 KB (added by Upliner, 15 years ago)

patch for support of undeleted objects

  • src/org/openstreetmap/josm/io/DiffResultProcessor.java

     
    124124                processed.add(p);
    125125                if (!p.isDeleted()) {
    126126                    p.setOsmId(entry.new_id, entry.new_version);
     127                    p.setVisible(true);
    127128                }
    128129                if (cs != null && !cs.isNew()) {
    129130                    p.setChangesetId(cs.getId());
  • src/org/openstreetmap/josm/io/OsmApi.java

     
    274274            ret = sendRequest("PUT", OsmPrimitiveType.from(osm).getAPIName()+"/" + osm.getId(), toXml(osm, true), monitor);
    275275            osm.setOsmId(osm.getId(), Integer.parseInt(ret.trim()));
    276276            osm.setChangesetId(getChangeset().getId());
     277            osm.setVisible(true);
    277278        } catch(NumberFormatException e) {
    278279            throw new OsmTransferException(tr("Unexpected format of new version of modified primitive ''{0}''. Got ''{1}''.", osm.getId(), ret));
    279280        }
  • src/org/openstreetmap/josm/io/OsmWriter.java

     
    9797    }
    9898
    9999    private boolean shouldWrite(OsmPrimitive osm) {
    100         return !osm.isNew() || !osm.isDeleted();
     100        return (!osm.isNew() && osm.isVisible()) || !osm.isDeleted();
    101101    }
    102102
    103103    public void writeDataSources(DataSet ds) {
  • src/org/openstreetmap/josm/data/osm/OsmPrimitive.java

     
    391391    }
    392392
    393393    /**
     394     * Replies <code>true</code> if the object has been deleted on the server and was undeleted by the user.
     395     * @return <code>true</code> if the object has been undeleted
     396     */
     397    public boolean isUndeleted() {
     398        return (flags & (FLAG_VISIBLE + FLAG_DELETED)) == 0;
     399    }
     400
     401    /**
    394402     * Replies <code>true</code>, if the object is usable (i.e. complete
    395403     * and not deleted).
    396404     *
     
    426434
    427435    public static Predicate<OsmPrimitive> nonDeletedPredicate = new Predicate<OsmPrimitive>() {
    428436        public boolean evaluate(OsmPrimitive primitive) {
    429             return primitive.isVisible() && !primitive.isDeleted();
     437            return !primitive.isDeleted();
    430438        }
    431439    };
    432440
    433441    public static Predicate<OsmPrimitive> nonDeletedCompletePredicate = new Predicate<OsmPrimitive>() {
    434442        public boolean evaluate(OsmPrimitive primitive) {
    435             return primitive.isVisible() && !primitive.isDeleted() && !primitive.isIncomplete();
     443            return !primitive.isDeleted() && !primitive.isIncomplete();
    436444        }
    437445    };
    438446
    439447    public static Predicate<OsmPrimitive> nonDeletedPhysicalPredicate = new Predicate<OsmPrimitive>() {
    440448        public boolean evaluate(OsmPrimitive primitive) {
    441             return primitive.isVisible() && !primitive.isDeleted() && !primitive.isIncomplete() && !(primitive instanceof Relation);
     449            return !primitive.isDeleted() && !primitive.isIncomplete() && !(primitive instanceof Relation);
    442450        }
    443451    };
    444452
    445453    public static Predicate<OsmPrimitive> modifiedPredicate = new Predicate<OsmPrimitive>() {
    446454        public boolean evaluate(OsmPrimitive primitive) {
    447             return primitive.isVisible() && primitive.isModified();
     455            return primitive.isModified();
    448456        }
    449457    };
    450458
     
    721729        } else {
    722730            flags &= ~FLAG_DELETED;
    723731        }
    724         setModified(deleted);
     732        setModified(deleted ^ !isVisible());
    725733        if (dataSet != null) {
    726734            if (deleted) {
    727735                dataSet.firePrimitivesRemoved(Collections.singleton(this), false);
  • src/org/openstreetmap/josm/data/APIDataSet.java

     
    5656        toUpdate.clear();
    5757        toDelete.clear();
    5858
     59        boolean sortUpdated = false;
    5960        for (OsmPrimitive osm :ds.allPrimitives()) {
    6061            if (osm.get("josm/ignore") != null) {
    6162                continue;
    6263            }
     64            if (osm.isUndeleted()) {
     65                sortUpdated = true;
     66            }
    6367            if (osm.isNew() && !osm.isDeleted()) {
    6468                toAdd.add(osm);
    6569            } else if (osm.isModified() && !osm.isDeleted()) {
     
    7074        }
    7175        sortDeleted();
    7276        sortNew();
     77        if (sortUpdated) {
     78            sortUpdated();
     79        }
    7380    }
    7481
    7582    /**
     
    131138                }
    132139        );
    133140    }
     141
    134142    /**
     143     * Ensures that primitives are modified in the following order: Nodes, then Ways,
     144     * then Relations. It's necessary for uploading undeleted objects.
     145     *
     146     */
     147    protected void sortUpdated() {
     148        Collections.sort(
     149                toUpdate,
     150                new Comparator<OsmPrimitive>() {
     151                    public int compare(OsmPrimitive o1, OsmPrimitive o2) {
     152                        if (o1 instanceof Node && o2 instanceof Node)
     153                            return 0;
     154                        else if (o1 instanceof Node)
     155                            return -1;
     156                        else if (o2 instanceof Node)
     157                            return 1;
     158
     159                        if (o1 instanceof Way && o2 instanceof Way)
     160                            return 0;
     161                        else if (o1 instanceof Way && o2 instanceof Relation)
     162                            return -1;
     163                        else if (o2 instanceof Way && o1 instanceof Relation)
     164                            return 1;
     165
     166                        return 0;
     167                    }
     168                }
     169        );
     170    }
     171
     172    /**
    135173     * initializes the API data set with the modified primitives in <code>ds</code>
    136174     *
    137175     * @param ds the data set. Ignored, if null.