source: osm/applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyRelationMemberConflictResolverModel.java@ 31315

Last change on this file since 31315 was 30988, checked in by donvip, 10 years ago

[josm_merge_overlap] fix #josm11092 - CCE

File size: 5.7 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package mergeoverlap.hack;
3
4import java.util.Collection;
5import java.util.LinkedList;
6import java.util.List;
7import java.util.Map;
8
9import mergeoverlap.MergeOverlapAction;
10
11import org.openstreetmap.josm.command.Command;
12import org.openstreetmap.josm.data.osm.OsmPrimitive;
13import org.openstreetmap.josm.data.osm.Relation;
14import org.openstreetmap.josm.data.osm.RelationMember;
15import org.openstreetmap.josm.data.osm.Way;
16import org.openstreetmap.josm.gui.conflict.tags.RelationMemberConflictDecision;
17import org.openstreetmap.josm.gui.conflict.tags.RelationMemberConflictResolverModel;
18
19/**
20 * This model manages a list of conflicting relation members.
21 *
22 * It can be used as {@link javax.swing.table.TableModel}.
23 */
24public class MyRelationMemberConflictResolverModel extends RelationMemberConflictResolverModel {
25 /** the property name for the number conflicts managed by this model */
26 public static final String NUM_CONFLICTS_PROP = MyRelationMemberConflictResolverModel.class.getName() + ".numConflicts";
27
28 @Override
29 protected String getProperty() {
30 return NUM_CONFLICTS_PROP;
31 }
32
33 @Override
34 protected void populate(Relation relation, OsmPrimitive primitive) {
35 throw new UnsupportedOperationException("Use populate(Relation, OsmPrimitive, Map<Way, Way>) instead");
36 }
37
38 /**
39 * Populates the model with the members of the relation <code>relation</code>
40 * referring to <code>way</code>.
41 *
42 * @param relation the parent relation
43 * @param way the child way
44 */
45 protected void populate(Relation relation, Way way, Map<Way, Way> oldWays) {
46 for (int i =0; i<relation.getMembersCount();i++) {
47 RelationMember mb = relation.getMember(i);
48 if (mb.isWay() && MergeOverlapAction.getOld(mb.getWay(), oldWays) == MergeOverlapAction.getOld(way, oldWays)) {
49 decisions.add(new RelationMemberConflictDecision(relation, i));
50 }
51 }
52 }
53
54 @Override
55 public void populate(Collection<Relation> relations, Collection<? extends OsmPrimitive> memberPrimitives) {
56 throw new UnsupportedOperationException(
57 "Use populate(Collection<Relation>, Collection<? extends OsmPrimitive>, Map<Way, Way>) instead");
58 }
59
60 /**
61 * Populates the model with the relation members belonging to one of the relations in <code>relations</code>
62 * and referring to one of the primitives in <code>memberPrimitives</code>.
63 *
64 * @param relations the parent relations. Empty list assumed if null.
65 * @param memberWays the child ways. Empty list assumed if null.
66 */
67 public void populate(Collection<Relation> relations, Collection<Way> memberWays, Map<Way, Way> oldWays) {
68 decisions.clear();
69 relations = relations == null ? new LinkedList<Relation>() : relations;
70 memberWays = memberWays == null ? new LinkedList<Way>() : memberWays;
71 for (Relation r : relations) {
72 for (Way w : memberWays) {
73 populate(r, w, oldWays);
74 }
75 }
76 this.relations = relations;
77 refresh();
78 }
79
80 @Override
81 protected Command buildResolveCommand(Relation relation, OsmPrimitive newPrimitive) {
82 throw new UnsupportedOperationException(
83 "Use buildResolveCorrespondance(Relation, OsmPrimitive, Map<Relation, Relation>, Map<Way, Way>) instead");
84 }
85
86 protected void buildResolveCorrespondance(
87 Relation relation, OsmPrimitive newPrimitive, Map<Relation, Relation> newRelations, Map<Way, Way> oldWays) {
88
89 List<RelationMember> relationsMembers = relation.getMembers();
90 Relation modifiedRelation = MergeOverlapAction.getNew(relation, newRelations);
91 modifiedRelation.setMembers(null);
92 for (int i=0; i < relationsMembers.size(); i++) {
93 RelationMember rm = relationsMembers.get(i);
94 RelationMemberConflictDecision decision = getDecision(relation, i);
95 if (decision == null) {
96 modifiedRelation.addMember(rm);
97 } else {
98 switch(decision.getDecision()) {
99 case KEEP:
100 if (newPrimitive instanceof Way) {
101 modifiedRelation.addMember(new RelationMember(decision.getRole(),
102 MergeOverlapAction.getOld((Way)newPrimitive, oldWays)));
103 } else {
104 modifiedRelation.addMember(new RelationMember(decision.getRole(), newPrimitive));
105 }
106 break;
107 case REMOVE:
108 // do nothing
109 break;
110 case UNDECIDED:
111 // FIXME: this is an error
112 break;
113 }
114 }
115 }
116 }
117
118 @Override
119 public List<Command> buildResolutionCommands(OsmPrimitive newPrimitive) {
120 throw new UnsupportedOperationException(
121 "Use buildRelationCorrespondance(OsmPrimitive, Map<Relation, Relation>, Map<Way, Way>) instead");
122 }
123
124 /**
125 * Builds a collection of commands executing the decisions made in this model.
126 *
127 * @param newPrimitive the primitive which members shall refer to if the
128 * decision is {@see RelationMemberConflictDecisionType#REPLACE}
129 */
130 public void buildRelationCorrespondance(OsmPrimitive newPrimitive, Map<Relation, Relation> newRelations, Map<Way, Way> oldWays) {
131 for (Relation relation : relations) {
132 buildResolveCorrespondance(relation, newPrimitive, newRelations, oldWays);
133 }
134 }
135}
Note: See TracBrowser for help on using the repository browser.