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<PrimitiveData>, 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).intern(); 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 OsmPrimitiveType getDisplayType() { 067 return getMemberType(); 068 } 069 070 @Override 071 public boolean isNode() { 072 return OsmPrimitiveType.NODE == memberType; 073 } 074 075 @Override 076 public boolean isWay() { 077 return OsmPrimitiveType.WAY == memberType; 078 } 079 080 @Override 081 public boolean isRelation() { 082 return OsmPrimitiveType.RELATION == memberType; 083 } 084 085 @Override 086 public PrimitiveData getMember() { 087 throw new UnsupportedOperationException(); 088 } 089 090 @Override 091 public String toString() { 092 return (memberType != null ? memberType.getAPIName() : "undefined") + ' ' + memberId; 093 } 094 095 /** 096 * PrimitiveId implementation. Returns the same value as {@link #getMemberType()} 097 */ 098 @Override 099 public OsmPrimitiveType getType() { 100 return getMemberType(); 101 } 102 103 /** 104 * PrimitiveId implementation. Returns the same value as {@link #getMemberId()} 105 */ 106 @Override 107 public long getUniqueId() { 108 return getMemberId(); 109 } 110 111 @Override 112 public boolean isNew() { 113 return memberId <= 0; 114 } 115 116 @Override 117 public int hashCode() { 118 return Objects.hash(role, memberId, memberType); 119 } 120 121 @Override 122 public boolean equals(Object obj) { 123 if (this == obj) return true; 124 if (obj == null || getClass() != obj.getClass()) return false; 125 RelationMemberData that = (RelationMemberData) obj; 126 return memberId == that.memberId && 127 memberType == that.memberType && 128 Objects.equals(role, that.role); 129 } 130}