001 // License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.gui.conflict.tags;
003
004 import org.openstreetmap.josm.data.osm.OsmPrimitive;
005 import org.openstreetmap.josm.data.osm.Relation;
006 import org.openstreetmap.josm.data.osm.RelationMember;
007 import org.openstreetmap.josm.tools.CheckParameterUtil;
008
009 import static org.openstreetmap.josm.tools.I18n.tr;
010 import static org.openstreetmap.josm.gui.conflict.tags.RelationMemberConflictDecisionType.*;
011
012 public class RelationMemberConflictDecision {
013
014 private Relation relation;
015 private int pos;
016 private OsmPrimitive originalPrimitive;
017 private String role;
018 private RelationMemberConflictDecisionType decision;
019
020 public RelationMemberConflictDecision(Relation relation, int pos) throws IllegalArgumentException {
021 CheckParameterUtil.ensureParameterNotNull(relation, "relation");
022 RelationMember member = relation.getMember(pos);
023 if (member == null)
024 throw new IndexOutOfBoundsException(tr("Position {0} is out of range. Current number of members is {1}.", pos, relation.getMembersCount()));
025 this.relation = relation;
026 this.pos = pos;
027 this.originalPrimitive = member.getMember();
028 this.role = member.hasRole()? member.getRole() : "";
029 this.decision = UNDECIDED;
030 }
031
032 public Relation getRelation() {
033 return relation;
034 }
035
036 public int getPos() {
037 return pos;
038 }
039
040 public OsmPrimitive getOriginalPrimitive() {
041 return originalPrimitive;
042 }
043
044 public String getRole() {
045 return role;
046 }
047
048 public RelationMemberConflictDecisionType getDecision() {
049 return decision;
050 }
051
052 public void setRole(String role) {
053 this.role = role == null ? "" : role;
054 }
055
056 public void decide(RelationMemberConflictDecisionType decision) {
057 if (decision == null) {
058 decision = UNDECIDED;
059 }
060 this.decision = decision;
061 }
062
063 public boolean isDecided() {
064 return ! UNDECIDED.equals(decision);
065 }
066
067 public boolean matches(Relation relation, int pos) {
068 return this.relation == relation && this.pos == pos;
069 }
070
071 @Override
072 public int hashCode() {
073 final int prime = 31;
074 int result = 1;
075 result = prime * result + ((decision == null) ? 0 : decision.hashCode());
076 result = prime * result + ((originalPrimitive == null) ? 0 : originalPrimitive.hashCode());
077 result = prime * result + pos;
078 result = prime * result + ((relation == null) ? 0 : relation.hashCode());
079 result = prime * result + ((role == null) ? 0 : role.hashCode());
080 return result;
081 }
082
083 @Override
084 public boolean equals(Object obj) {
085 if (this == obj)
086 return true;
087 if (obj == null)
088 return false;
089 if (getClass() != obj.getClass())
090 return false;
091 RelationMemberConflictDecision other = (RelationMemberConflictDecision) obj;
092 if (decision == null) {
093 if (other.decision != null)
094 return false;
095 } else if (!decision.equals(other.decision))
096 return false;
097 if (originalPrimitive == null) {
098 if (other.originalPrimitive != null)
099 return false;
100 } else if (!originalPrimitive.equals(other.originalPrimitive))
101 return false;
102 if (pos != other.pos)
103 return false;
104 if (relation == null) {
105 if (other.relation != null)
106 return false;
107 } else if (!relation.equals(other.relation))
108 return false;
109 if (role == null) {
110 if (other.role != null)
111 return false;
112 } else if (!role.equals(other.role))
113 return false;
114 return true;
115 }
116 }