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}