001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.data.osm;
003
004import java.util.Arrays;
005
006/**
007 * IRelationMember captures the common functions of {@link RelationMember} and {@link RelationMemberData}.
008 * @param <P> the base type of OSM primitives
009 * @since 13677
010 */
011public interface IRelationMember<P extends IPrimitive> extends PrimitiveId {
012
013    /**
014     * Returns the role of this relation member.
015     * @return Role name or "". Never returns null
016     */
017    String getRole();
018
019    /**
020     * Determines if this relation member has a role.
021     * @return True if role is set
022     */
023    default boolean hasRole() {
024        return !"".equals(getRole());
025    }
026
027    /**
028     * Determines if this relation member's role is in the given list.
029     * @param roles The roles to look after
030     * @return True if role is in the given list
031     */
032    default boolean hasRole(String... roles) {
033        return Arrays.asList(roles).contains(getRole());
034    }
035
036    /**
037     * Determines if this relation member is a node.
038     * @return True if member is node
039     */
040    boolean isNode();
041
042    /**
043     * Determines if this relation member is a way.
044     * @return True if member is way
045     */
046    boolean isWay();
047
048    /**
049     * Determines if this relation member is a relation.
050     * @return True if member is relation
051     */
052    boolean isRelation();
053
054    /**
055     * Returns type of member for icon display.
056     * @return type of member for icon display
057     * @since 13766 (IRelationMember)
058     */
059    default OsmPrimitiveType getDisplayType() {
060        return getMember().getDisplayType();
061    }
062
063    /**
064     * Returns the relation member.
065     * @return Member. Returned value is never null.
066     * @since 13766 (IRelationMember)
067     */
068    P getMember();
069
070    /**
071     * Returns the relation member as a way.
072     * @return Member as a way
073     * @since 17862
074     */
075    default IWay<?> getWay() {
076        return (IWay<?>) getMember();
077    }
078}