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}