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

Last change on this file was 19108, checked in by taylor.smock, 2 years ago

Cleanup some new PMD warnings from PMD 7.x (followup of r19101)

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