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}