Ignore:
Timestamp:
2014-05-14T23:03:49+02:00 (10 years ago)
Author:
simon04
Message:

see #10018 - Avoid broken relations after combining ways

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/conflict/tags/CombinePrimitiveResolverDialog.java

    r7005 r7129  
    1818import java.beans.PropertyChangeListener;
    1919import java.util.Collection;
    20 import java.util.HashSet;
     20import java.util.Collections;
     21import java.util.HashMap;
    2122import java.util.LinkedList;
    2223import java.util.List;
     24import java.util.Map;
    2325import java.util.Set;
    2426
     
    4951import org.openstreetmap.josm.tools.CheckParameterUtil;
    5052import org.openstreetmap.josm.tools.ImageProvider;
     53import org.openstreetmap.josm.tools.MultiMap;
     54import org.openstreetmap.josm.tools.Predicates;
    5155import org.openstreetmap.josm.tools.Utils;
    5256import org.openstreetmap.josm.tools.Utils.Function;
     
    297301
    298302    protected void prepareDefaultRelationDecisions() {
    299         RelationMemberConflictResolverModel model = getRelationMemberConflictResolverModel();
    300         Set<Relation> relations = new HashSet<>();
     303        final RelationMemberConflictResolverModel model = getRelationMemberConflictResolverModel();
     304        final Map<Relation, Integer> numberOfKeepResolutions = new HashMap<>();
     305        final MultiMap<OsmPrimitive, Relation> resolvedRelationsPerPrimitive = new MultiMap<>();
     306
    301307        for (int i = 0; i < model.getNumDecisions(); i++) {
    302             RelationMemberConflictDecision decision = model.getDecision(i);
    303             if (!relations.contains(decision.getRelation())) {
     308            final RelationMemberConflictDecision decision = model.getDecision(i);
     309            final Relation r = decision.getRelation();
     310            final OsmPrimitive p = decision.getOriginalPrimitive();
     311            if (!numberOfKeepResolutions.containsKey(r)) {
    304312                decision.decide(RelationMemberConflictDecisionType.KEEP);
    305                 relations.add(decision.getRelation());
     313                numberOfKeepResolutions.put(r, 1);
     314                resolvedRelationsPerPrimitive.put(p, r);
     315                continue;
     316            }
     317
     318            final Integer keepResolutions = numberOfKeepResolutions.get(r);
     319            final Collection<Relation> resolvedRelations = Utils.firstNonNull(resolvedRelationsPerPrimitive.get(p), Collections.<Relation>emptyList());
     320            if (keepResolutions <= Utils.filter(resolvedRelations, Predicates.equalTo(r)).size()) {
     321                // old relation contains one primitive more often than the current resolution => keep the current member
     322                decision.decide(RelationMemberConflictDecisionType.KEEP);
     323                numberOfKeepResolutions.put(r, keepResolutions + 1);
     324                resolvedRelationsPerPrimitive.put(p, r);
    306325            } else {
    307326                decision.decide(RelationMemberConflictDecisionType.REMOVE);
     327                resolvedRelationsPerPrimitive.put(p, r);
    308328            }
    309329        }
     
    552572        /* I18n: object count < 2 is not possible */
    553573        String msg = trn("You are about to combine {1} object, "
    554                 + "which are part of {0} relation:<br/>{2}"
     574                + "which is part of {0} relation:<br/>{2}"
    555575                + "Combining these objects may break this relation. If you are unsure, please cancel this operation.<br/>"
    556576                + "If you want to continue, you are shown a dialog to decide how to adapt the relation.<br/><br/>"
Note: See TracChangeset for help on using the changeset viewer.