// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.conflict.tags; import org.openstreetmap.josm.data.osm.OsmPrimitive; import org.openstreetmap.josm.data.osm.Relation; import org.openstreetmap.josm.data.osm.RelationMember; import org.openstreetmap.josm.tools.CheckParameterUtil; import static org.openstreetmap.josm.tools.I18n.tr; import static org.openstreetmap.josm.gui.conflict.tags.RelationMemberConflictDecisionType.*; public class RelationMemberConflictDecision { private Relation relation; private int pos; private OsmPrimitive originalPrimitive; private String role; private RelationMemberConflictDecisionType decision; public RelationMemberConflictDecision(Relation relation, int pos) throws IllegalArgumentException { CheckParameterUtil.ensureParameterNotNull(relation, "relation"); RelationMember member = relation.getMember(pos); if (member == null) throw new IndexOutOfBoundsException(tr("Position {0} is out of range. Current number of members is {1}.", pos, relation.getMembersCount())); this.relation = relation; this.pos = pos; this.originalPrimitive = member.getMember(); this.role = member.hasRole()? member.getRole() : ""; this.decision = UNDECIDED; } public Relation getRelation() { return relation; } public int getPos() { return pos; } public OsmPrimitive getOriginalPrimitive() { return originalPrimitive; } public String getRole() { return role; } public RelationMemberConflictDecisionType getDecision() { return decision; } public void setRole(String role) { this.role = role == null ? "" : role; } public void decide(RelationMemberConflictDecisionType decision) { if (decision == null) { decision = UNDECIDED; } this.decision = decision; } public boolean isDecided() { return ! UNDECIDED.equals(decision); } public boolean matches(Relation relation, int pos) { return this.relation == relation && this.pos == pos; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((decision == null) ? 0 : decision.hashCode()); result = prime * result + ((originalPrimitive == null) ? 0 : originalPrimitive.hashCode()); result = prime * result + pos; result = prime * result + ((relation == null) ? 0 : relation.hashCode()); result = prime * result + ((role == null) ? 0 : role.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; RelationMemberConflictDecision other = (RelationMemberConflictDecision) obj; if (decision == null) { if (other.decision != null) return false; } else if (!decision.equals(other.decision)) return false; if (originalPrimitive == null) { if (other.originalPrimitive != null) return false; } else if (!originalPrimitive.equals(other.originalPrimitive)) return false; if (pos != other.pos) return false; if (relation == null) { if (other.relation != null) return false; } else if (!relation.equals(other.relation)) return false; if (role == null) { if (other.role != null) return false; } else if (!role.equals(other.role)) return false; return true; } }