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