source: josm/trunk/src/org/openstreetmap/josm/data/osm/IRelation.java@ 16119

Last change on this file since 16119 was 16119, checked in by Don-vip, 4 years ago

fix #18928 - fix various crashes with empty ways

  • Property svn:eol-style set to native
File size: 4.2 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.data.osm;
3
4import java.util.Collection;
5import java.util.HashSet;
6import java.util.List;
7import java.util.Set;
8import java.util.stream.Collectors;
9
10import org.openstreetmap.josm.tools.Utils;
11
12/**
13 * IRelation captures the common functions of {@link Relation} and {@link RelationData}.
14 * @param <M> Type of OSM relation member
15 * @since 4098
16 */
17public interface IRelation<M extends IRelationMember<?>> extends IPrimitive {
18
19 /**
20 * Returns the number of members.
21 * @return number of members
22 */
23 int getMembersCount();
24
25 /**
26 * Determines if this relation is empty, i.e. it has no members.
27 * @return {@code true} if this relation is empty, i.e. it has no members
28 * @since 16119
29 */
30 default boolean isEmpty() {
31 return getMembersCount() == 0;
32 }
33
34 /**
35 * Returns the relation member at the specified index.
36 * @param index the index of the relation member
37 * @return relation member at the specified index
38 * @since 13766 (IRelation)
39 */
40 M getMember(int index);
41
42 /**
43 * Returns members of the relation.
44 * @return Members of the relation. Changes made in returned list are not mapped
45 * back to the primitive, use {@link #setMembers} to modify the members
46 * @since 1925
47 * @since 13766 (IRelation)
48 */
49 List<M> getMembers();
50
51 /**
52 * Sets members of the relation.
53 * @param members Can be null, in that case all members are removed
54 */
55 void setMembers(List<M> members);
56
57 /**
58 * Returns id of the member at given index.
59 * @param idx member index
60 * @return id of the member at given index
61 */
62 long getMemberId(int idx);
63
64 /**
65 * Returns role of the member at given index.
66 * @param idx member index
67 * @return role of the member at given index
68 */
69 String getRole(int idx);
70
71 /**
72 * Returns type of the member at given index.
73 * @param idx member index
74 * @return type of the member at given index
75 */
76 OsmPrimitiveType getMemberType(int idx);
77
78 /**
79 * Determines if at least one child primitive is incomplete.
80 *
81 * @return true if at least one child primitive is incomplete
82 * @since 13564
83 */
84 default boolean hasIncompleteMembers() {
85 return false;
86 }
87
88 @Override
89 default int compareTo(IPrimitive o) {
90 return o instanceof IRelation ? Long.compare(getUniqueId(), o.getUniqueId()) : -1;
91 }
92
93 @Override
94 default String getDisplayName(NameFormatter formatter) {
95 return formatter.format(this);
96 }
97
98 /**
99 * Determines if this relation is a boundary.
100 * @return {@code true} if a boundary relation
101 */
102 default boolean isBoundary() {
103 return "boundary".equals(get("type"));
104 }
105
106 @Override
107 default boolean isMultipolygon() {
108 return "multipolygon".equals(get("type")) || isBoundary();
109 }
110
111 /**
112 * Returns an unmodifiable list of the {@link OsmPrimitive}s referred to by at least one member of this relation.
113 * @return an unmodifiable list of the primitives
114 * @since 13957
115 */
116 default List<? extends IPrimitive> getMemberPrimitivesList() {
117 return Utils.transform(getMembers(), IRelationMember::getMember);
118 }
119
120 /**
121 * Replies a collection with the incomplete children this relation refers to.
122 *
123 * @return the incomplete children. Empty collection if no children are incomplete.
124 * @since 13957
125 */
126 default Collection<? extends IPrimitive> getIncompleteMembers() {
127 Set<IPrimitive> ret = new HashSet<>();
128 for (M rm : getMembers()) {
129 if (!rm.getMember().isIncomplete()) {
130 continue;
131 }
132 ret.add(rm.getMember());
133 }
134 return ret;
135 }
136
137 /**
138 * Returns a list of relation members having the specified role.
139 * @param role role
140 * @return a list of relation members having the specified role
141 * @since 15418
142 */
143 default List<? extends IPrimitive> findRelationMembers(String role) {
144 return getMembers().stream().filter(rmv -> role.equals(rmv.getRole()))
145 .map(IRelationMember::getMember).collect(Collectors.toList());
146 }
147}
Note: See TracBrowser for help on using the repository browser.