Ticket #5135: undelete.3.diff

File undelete.3.diff, 18.0 KB (added by Upliner, 16 years ago)

more robust solution

  • src/org/openstreetmap/josm/actions/search/SearchCompiler.java

     
    561561
    562562    private static class Modified extends Match {
    563563        @Override public boolean match(OsmPrimitive osm) {
    564             return osm.isModified() || osm.isNew();
     564            return osm.isModified() || osm.isNewOrUndeleted();
    565565        }
    566566        @Override public String toString() {return "modified";}
    567567    }
  • src/org/openstreetmap/josm/actions/UploadSelectionAction.java

     
    7777    protected Set<OsmPrimitive> getModifiedPrimitives(Collection<OsmPrimitive> primitives) {
    7878        HashSet<OsmPrimitive> ret = new HashSet<OsmPrimitive>();
    7979        for (OsmPrimitive p: primitives) {
    80             if (p.isNew()) {
     80            if (p.isNewOrUndeleted()) {
    8181                ret.add(p);
    82             } else if (p.isVisible() && p.isModified() && !p.isIncomplete()) {
     82            } else if (p.isModified() && !p.isIncomplete()) {
    8383                ret.add(p);
    8484            }
    8585        }
     
    170170    /**
    171171     * Computes the collection of primitives to upload, given a collection of candidate
    172172     * primitives.
    173      * Some of the candidates are excluded, i.e. if they aren't modified or if they
    174      * aren't visible.
     173     * Some of the candidates are excluded, i.e. if they aren't modified.
    175174     * Other primitives are added. A typical case is a primitive which is new and and
    176175     * which is referred by a modified relation. In order to upload the relation the
    177176     * new primitive has to be uploaded as well, even if it isn't included in the
     
    186185        }
    187186
    188187        public void visit(Node n) {
    189             if (n.isNew() || ((n.isModified() || n.isDeleted()) && n.isVisible())) {
     188            if (n.isNewOrUndeleted() || n.isModified() || n.isDeleted()) {
    190189                // upload new nodes as well as modified and deleted ones
    191190                hull.add(n);
    192191            }
    193192        }
    194193
    195194        public void visit(Way w) {
    196             if (w.isNew() || ((w.isModified() || w.isDeleted()) && w.isVisible())) {
     195            if (w.isNewOrUndeleted() || w.isModified() || w.isDeleted()) {
    197196                // upload new ways as well as modified and deleted ones
    198197                hull.add(w);
    199198                for (Node n: w.getNodes()) {
     
    205204        }
    206205
    207206        public void visit(Relation r) {
    208             if (r.isNew() || ((r.isModified() || r.isDeleted()) && r.isVisible())) {
     207            if (r.isNewOrUndeleted() || r.isModified() || r.isDeleted()) {
    209208                hull.add(r);
    210209                for (OsmPrimitive p : r.getMemberPrimitives()) {
    211210                    // add new relation members. Don't include modified
    212211                    // relation members. r shouldn't refer to deleted primitives,
    213212                    // so wont check here for deleted primitives here
    214213                    //
    215                     if (p.isNew()) {
     214                    if (p.isNewOrUndeleted()) {
    216215                        p.visit(this);
    217216                    }
    218217                }
     
    294293        protected Set<OsmPrimitive> getPrimitivesToCheckForParents() {
    295294            HashSet<OsmPrimitive> ret = new HashSet<OsmPrimitive>();
    296295            for (OsmPrimitive p: toUpload) {
    297                 if (p.isDeleted() && !p.isNew()) {
     296                if (p.isDeleted() && !p.isNewOrUndeleted()) {
    298297                    ret.add(p);
    299298                }
    300299            }
  • src/org/openstreetmap/josm/actions/SaveActionBase.java

     
    138138     */
    139139    private boolean isDataSetEmpty(OsmDataLayer layer) {
    140140        for (OsmPrimitive osm : layer.data.allNonDeletedPrimitives())
    141             if (!osm.isDeleted() || !osm.isNew())
     141            if (!osm.isDeleted() || !osm.isNewOrUndeleted())
    142142                return false;
    143143        return true;
    144144    }
  • src/org/openstreetmap/josm/gui/preferences/TaggingPresetPreference.java

     
    4747
    4848
    4949    private ValidationListener validationListener = new ValidationListener() {
    50         @Override
    5150        public boolean validatePreferences() {
    5251            if (sources.hasActiveStylesChanged()) {
    5352                List<String> sourcesToRemove = new ArrayList<String>();
  • src/org/openstreetmap/josm/gui/MapStatus.java

     
    419419        private final JLabel popupBuildPrimitiveLabels(final OsmPrimitive osm) {
    420420            final StringBuilder text = new StringBuilder();
    421421            String name = osm.getDisplayName(DefaultNameFormatter.getInstance());
    422             if (osm.isNew() || osm.isModified()) {
     422            if (osm.isNewOrUndeleted() || osm.isModified()) {
    423423                name = "<i><b>"+ name + "*</b></i>";
    424424            }
    425425            text.append(name);
  • 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.isNewOrUndeleted() || !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
     
    539547    }
    540548
    541549    /**
     550     *
     551     * @return True if primitive is new or undeleted
     552     * @see #isNew()
     553     * @see #isUndeleted()
     554     */
     555    public boolean isNewOrUndeleted() {
     556        return (id <= 0) || ((flags & (FLAG_VISIBLE + FLAG_DELETED)) == 0);
     557    }
     558
     559    /**
    542560     * Sets the id and the version of this primitive if it is known to the OSM API.
    543561     *
    544562     * Since we know the id and its version it can't be incomplete anymore. incomplete
     
    721739        } else {
    722740            flags &= ~FLAG_DELETED;
    723741        }
    724         setModified(deleted);
     742        setModified(deleted ^ !isVisible());
    725743        if (dataSet != null) {
    726744            if (deleted) {
    727745                dataSet.firePrimitivesRemoved(Collections.singleton(this), false);
  • src/org/openstreetmap/josm/data/osm/DatasetConsistencyTest.java

     
    126126
    127127    public void checkZeroNodesWays() {
    128128        for (Way way:dataSet.getWays()) {
    129             if (way.isUsable() && way.isVisible() && way.getNodesCount() == 0) {
     129            if (way.isUsable() && way.getNodesCount() == 0) {
    130130                printError("WARN - ZERO NODES", "Way %s has zero nodes", way);
    131131            } else if (way.isUsable() && way.getNodesCount() == 1) {
    132132                printError("WARN - NO NODES", "Way %s has only one node", way);
  • src/org/openstreetmap/josm/data/osm/DataSetMerger.java

     
    188188        for (Node sourceNode : source.getNodes()) {
    189189            Node targetNode = (Node)getMergeTarget(sourceNode);
    190190            if (targetNode != null) {
    191                 if (targetNode.isVisible()) {
    192                     newNodes.add(targetNode);
    193                     if (targetNode.isDeleted() && !conflicts.hasConflictForMy(targetNode)) {
    194                         conflicts.add(new Conflict<OsmPrimitive>(targetNode, sourceNode, true));
    195                         targetNode.setDeleted(false);
    196                     }
    197                 } else {
    198                     target.setModified(true);
     191                newNodes.add(targetNode);
     192                if (targetNode.isDeleted() && !conflicts.hasConflictForMy(targetNode)) {
     193                    conflicts.add(new Conflict<OsmPrimitive>(targetNode, sourceNode, true));
     194                    targetNode.setDeleted(false);
    199195                }
    200196            } else
    201197                throw new IllegalStateException(tr("Missing merge target for node with id {0}", sourceNode.getUniqueId()));
     
    219215            OsmPrimitive targetMember = getMergeTarget(sourceMember.getMember());
    220216            if (targetMember == null)
    221217                throw new IllegalStateException(tr("Missing merge target of type {0} with id {1}", sourceMember.getType(), sourceMember.getUniqueId()));
    222             if (targetMember.isVisible()) {
    223                 RelationMember newMember = new RelationMember(sourceMember.getRole(), targetMember);
    224                 newMembers.add(newMember);
    225                 if (targetMember.isDeleted() && !conflicts.hasConflictForMy(targetMember)) {
    226                     conflicts.add(new Conflict<OsmPrimitive>(targetMember, sourceMember.getMember(), true));
    227                     targetMember.setDeleted(false);
    228                 }
    229             } else {
    230                 target.setModified(true);
     218            RelationMember newMember = new RelationMember(sourceMember.getRole(), targetMember);
     219            newMembers.add(newMember);
     220            if (targetMember.isDeleted() && !conflicts.hasConflictForMy(targetMember)) {
     221                conflicts.add(new Conflict<OsmPrimitive>(targetMember, sourceMember.getMember(), true));
     222                targetMember.setDeleted(false);
    231223            }
    232224        }
    233225        target.setMembers(newMembers);
     
    251243        if (target.getVersion() > source.getVersion())
    252244            // target.version > source.version => keep target version
    253245            return true;
    254         if (! target.isVisible() && source.isVisible()) {
     246        if (! target.isVisible() && source.isVisible() && target.getVersion() == source.getVersion()) {
    255247            // should not happen
    256             // FIXME: this message does not make sense, source version can not be lower than
    257             //        target version at this point
    258             logger.warning(tr("Target object with id {0} and version {1} is visible although "
    259                     + "source object with lower version {2} is not visible. "
    260                     + "Cannot deal with this inconsistency. Keeping target object. ",
    261                     Long.toString(target.getId()),Long.toString(target.getVersion()), Long.toString(source.getVersion())
    262             ));
     248            conflicts.add(target,source);
    263249        } else if (target.isVisible() && ! source.isVisible()) {
    264250            // this is always a conflict because the user has to decide whether
    265251            // he wants to create a clone of its target primitive or whether he
  • src/org/openstreetmap/josm/data/APIDataSet.java

     
    6060            if (osm.get("josm/ignore") != null) {
    6161                continue;
    6262            }
    63             if (osm.isNew() && !osm.isDeleted()) {
     63            if (osm.isNewOrUndeleted() && !osm.isDeleted()) {
    6464                toAdd.add(osm);
    6565            } else if (osm.isModified() && !osm.isDeleted()) {
    6666                toUpdate.add(osm);
    67             } else if (osm.isDeleted() && !osm.isNew() && osm.isModified()) {
     67            } else if (osm.isDeleted() && !osm.isNew() && osm.isModified() && osm.isVisible()) {
    6868                toDelete.add(osm);
    6969            }
    7070        }
     
    197197        toUpdate.clear();
    198198        toDelete.clear();
    199199        for (OsmPrimitive osm: primitives) {
    200             if (osm.isNew() && !osm.isDeleted()) {
     200            if (osm.isNewOrUndeleted() && !osm.isDeleted()) {
    201201                toAdd.addLast(osm);
    202202            } else if (osm.isModified() && !osm.isDeleted()) {
    203203                toUpdate.addLast(osm);
    204             } else if (osm.isDeleted() && !osm.isNew() && osm.isModified()) {
     204            } else if (osm.isDeleted() && !osm.isNew() && osm.isModified() && osm.isVisible()) {
    205205                toDelete.addFirst(osm);
    206206            }
    207207        }
     
    311311        for (Relation relation: relations) {
    312312            boolean refersToNewRelation = false;
    313313            for (RelationMember m : relation.getMembers()) {
    314                 if (m.isRelation() && m.getMember().isNew()) {
     314                if (m.isRelation() && m.getMember().isNewOrUndeleted()) {
    315315                    refersToNewRelation = true;
    316316                    break;
    317317                }
     
    349349        public void build(Collection<Relation> relations) {
    350350            this.relations = new HashSet<Relation>();
    351351            for(Relation relation: relations) {
    352                 if (!relation.isNew() ) {
     352                if (!relation.isNewOrUndeleted() ) {
    353353                    continue;
    354354                }
    355355                this.relations.add(relation);
    356356                for (RelationMember m: relation.getMembers()) {
    357                     if (m.isRelation() && m.getMember().isNew()) {
     357                    if (m.isRelation() && m.getMember().isNewOrUndeleted()) {
    358358                        addDependency(relation, (Relation)m.getMember());
    359359                    }
    360360                }
  • src/org/openstreetmap/josm/command/DeleteCommand.java

     
    444444            for (OsmPrimitive osm : primitivesToDelete) {
    445445                if (osm.isIncomplete())
    446446                    incomplete = true;
    447                 else if (osm instanceof Node && !osm.isNew()
     447                else if (osm instanceof Node && !osm.isNewOrUndeleted()
    448448                && !a.contains(((Node) osm).getCoor()))
    449449                    outside = true;
    450450            }