001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.data.osm; 003 004/** 005 * IRelation captures the common functions of {@link Relation} and {@link RelationData}. 006 * @since 4098 007 */ 008public interface IRelation extends IPrimitive { 009 010 /** 011 * Returns the number of members. 012 * @return number of members 013 */ 014 int getMembersCount(); 015 016 /** 017 * Returns id of the member at given index. 018 * @param idx member index 019 * @return id of the member at given index 020 */ 021 long getMemberId(int idx); 022 023 /** 024 * Returns role of the member at given index. 025 * @param idx member index 026 * @return role of the member at given index 027 */ 028 String getRole(int idx); 029 030 /** 031 * Returns type of the member at given index. 032 * @param idx member index 033 * @return type of the member at given index 034 */ 035 OsmPrimitiveType getMemberType(int idx); 036 037 /** 038 * Determines if at least one child primitive is incomplete. 039 * 040 * @return true if at least one child primitive is incomplete 041 * @since 13564 042 */ 043 default boolean hasIncompleteMembers() { 044 return false; 045 } 046 047 @Override 048 default int compareTo(IPrimitive o) { 049 return o instanceof IRelation ? Long.compare(getUniqueId(), o.getUniqueId()) : -1; 050 } 051 052 @Override 053 default String getDisplayName(NameFormatter formatter) { 054 return formatter.format(this); 055 } 056 057 /** 058 * Determines if this relation is a boundary. 059 * @return {@code true} if a boundary relation 060 */ 061 default boolean isBoundary() { 062 return "boundary".equals(get("type")); 063 } 064 065 @Override 066 default boolean isMultipolygon() { 067 return "multipolygon".equals(get("type")) || isBoundary(); 068 } 069}