// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.data.osm;
import java.util.Arrays;
import java.util.Objects;
import java.util.Optional;
import org.openstreetmap.josm.tools.CheckParameterUtil;
/**
* A linkage class that can be used by an relation to keep a list of
* members. Since membership may be qualified by a "role", a simple
* list is not sufficient.
*
*/
public class RelationMember implements PrimitiveId {
/**
*
*/
private final String role;
/**
*
*/
private final OsmPrimitive member;
/**
* Returns the role of this relation member.
* @return Role name or "". Never returns null
* @since 1930
*/
public String getRole() {
return role;
}
/**
* Determines if this relation member has a role.
* @return True if role is set
* @since 1930
*/
public boolean hasRole() {
return !"".equals(role);
}
/**
* Determines if this relation member's role is in the given list.
* @param roles The roles to look after
* @return True if role is in the given list
* @since 6305
*/
public boolean hasRole(String... roles) {
return Arrays.asList(roles).contains(role);
}
/**
* Determines if this relation member is a relation.
* @return True if member is relation
* @since 1937
*/
public boolean isRelation() {
return member instanceof Relation;
}
/**
* Determines if this relation member is a way.
* @return True if member is way
* @since 1937
*/
public boolean isWay() {
return member instanceof Way;
}
/**
*
* @return type of member for icon display
* @since 3844
*/
public OsmPrimitiveType getDisplayType() {
return member.getDisplayType();
}
/**
* Determines if this relation member is a node.
* @return True if member is node
* @since 1937
*/
public boolean isNode() {
return member instanceof Node;
}
/**
* Returns the relation member as a relation.
* @return Member as relation
* @since 1937
*/
public Relation getRelation() {
return (Relation) member;
}
/**
* Returns the relation member as a way.
* @return Member as way
* @since 1937
*/
public Way getWay() {
return (Way) member;
}
/**
* Returns the relation member as a node.
* @return Member as node
* @since 1937
*/
public Node getNode() {
return (Node) member;
}
/**
* Returns the relation member.
* @return Member. Returned value is never null.
* @since 1937
*/
public OsmPrimitive getMember() {
return member;
}
/**
* Constructs a new {@code RelationMember}.
* @param role Can be null, in this case it's save as ""
* @param member Cannot be null
* @throws IllegalArgumentException if member is <code>null</code>
*/
public RelationMember(String role, OsmPrimitive member) {
CheckParameterUtil.ensureParameterNotNull(member, "member");
this.role = Optional.ofNullable(role).orElse("");
this.member = member;
}
/**
* Copy constructor.
* This constructor is left only for backwards compatibility. Copying RelationMember doesn't make sense
* because it's immutable
* @param other relation member to be copied.
*/
public RelationMember(RelationMember other) {
this(other.role, other.member);
}
@Override
public String toString() {
return '"' + role + "\"=" + member;
}
/**
* Replies true, if this relation member refers to the primitive
*
* @param primitive the primitive to check
* @return true, if this relation member refers to the primitive
*/
public boolean refersTo(OsmPrimitive primitive) {
return member == primitive;
}
@Override
public int hashCode() {
return Objects.hash(role, member);
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
RelationMember that = (RelationMember) obj;
return Objects.equals(role, that.role) &&
Objects.equals(member, that.member);
}
/**
* PrimitiveId implementation. Returns the same value as getMember().getType()
*/
@Override
public OsmPrimitiveType getType() {
return member.getType();
}
/**
* PrimitiveId implementation. Returns the same value as getMemberType().getUniqueId()
*/
@Override
public long getUniqueId() {
return member.getUniqueId();
}
@Override
public boolean isNew() {
return member.isNew();
}
}