001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.data.osm; 003 004import java.io.Serializable; 005import java.util.Objects; 006 007import org.openstreetmap.josm.tools.CheckParameterUtil; 008 009public class RelationMemberData implements PrimitiveId, Serializable { 010 011 private static final long serialVersionUID = 381392198209333319L; 012 private final String role; 013 private final long memberId; 014 private final OsmPrimitiveType memberType; 015 016 /** 017 * Constructs a new {@code RelationMemberData}. 018 * @param role member role - can be null 019 * @param type member type - cannot be null 020 * @param id member id - cannot be null 021 * @throws IllegalArgumentException is type or id is null 022 */ 023 public RelationMemberData(String role, OsmPrimitiveType type, long id) { 024 CheckParameterUtil.ensureParameterNotNull(type, "type"); 025 this.role = role == null ? "" : role; 026 this.memberType = type; 027 this.memberId = id; 028 } 029 030 /** 031 * Constructs a new {@code RelationMemberData}. 032 * @param role member role - can be null 033 * @param primitive member type and id - cannot be null 034 * @throws NullPointerException if primitive is null 035 */ 036 public RelationMemberData(String role, PrimitiveId primitive) { 037 this(role, primitive.getType(), primitive.getUniqueId()); 038 } 039 040 /** 041 * Get member id. 042 * @return member id 043 */ 044 public long getMemberId() { 045 return memberId; 046 } 047 048 /** 049 * Get member role. 050 * @return member role 051 */ 052 public String getRole() { 053 return role; 054 } 055 056 /** 057 * Get member type. 058 * @return member type 059 */ 060 public OsmPrimitiveType getMemberType() { 061 return memberType; 062 } 063 064 /** 065 * Determines if this member has a role. 066 * @return {@code true} if this member has a role 067 */ 068 public boolean hasRole() { 069 return !"".equals(role); 070 } 071 072 @Override 073 public String toString() { 074 return (memberType != null ? memberType.getAPIName() : "undefined") + ' ' + memberId; 075 } 076 077 /** 078 * PrimitiveId implementation. Returns the same value as {@link #getMemberType()} 079 */ 080 @Override 081 public OsmPrimitiveType getType() { 082 return memberType; 083 } 084 085 /** 086 * PrimitiveId implementation. Returns the same value as {@link #getMemberId()} 087 */ 088 @Override 089 public long getUniqueId() { 090 return memberId; 091 } 092 093 @Override 094 public boolean isNew() { 095 return memberId <= 0; 096 } 097 098 @Override 099 public int hashCode() { 100 return Objects.hash(role, memberId, memberType); 101 } 102 103 @Override 104 public boolean equals(Object obj) { 105 if (this == obj) return true; 106 if (obj == null || getClass() != obj.getClass()) return false; 107 RelationMemberData that = (RelationMemberData) obj; 108 return memberId == that.memberId && 109 Objects.equals(role, that.role) && 110 memberType == that.memberType; 111 } 112}