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}