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