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 }