Ticket #5135: undelete.diff

File undelete.diff, 6.4 KB (added by Upliner, 2 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.