001 // License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.data.osm;
003
004 /**
005 * A linkage class that can be used by an relation to keep a list of
006 * members. Since membership may be qualified by a "role", a simple
007 * list is not sufficient.
008 *
009 */
010 public class RelationMember implements PrimitiveId {
011
012 /**
013 *
014 */
015 private final String role;
016
017 /**
018 *
019 */
020 private final OsmPrimitive member;
021
022 /**
023 *
024 * @return Role name or "". Never returns null
025 * @since 1930
026 */
027 public String getRole() {
028 return role;
029 }
030
031 /**
032 *
033 * @return True if role is set
034 * @since 1930
035 */
036 public boolean hasRole() {
037 return !"".equals(role);
038 }
039
040 /**
041 *
042 * @return True if member is relation
043 * @since 1937
044 */
045 public boolean isRelation() {
046 return member instanceof Relation;
047 }
048
049 /**
050 *
051 * @return True if member is way
052 * @since 1937
053 */
054 public boolean isWay() {
055 return member instanceof Way;
056 }
057
058 /**
059 *
060 * @return type of member for icon display
061 * @since 3844
062 */
063 public OsmPrimitiveType getDisplayType() {
064 return member.getDisplayType();
065 }
066
067 /**
068 *
069 * @return True if member is node
070 * @since 1937
071 */
072 public boolean isNode() {
073 return member instanceof Node;
074 }
075
076 /**
077 *
078 * @return Member as relation
079 * @since 1937
080 */
081 public Relation getRelation() {
082 return (Relation)member;
083 }
084
085 /**
086 *
087 * @return Member as way
088 * @since 1937
089 */
090 public Way getWay() {
091 return (Way)member;
092 }
093
094 /**
095 *
096 * @return Member as node
097 * @since 1937
098 */
099 public Node getNode() {
100 return (Node)member;
101 }
102
103 /**
104 *
105 * @return Member. Returned value is never null.
106 * @since 1937
107 */
108 public OsmPrimitive getMember() {
109 return member;
110 }
111
112 /**
113 *
114 * @param role Can be null, in this case it's save as ""
115 * @param member Cannot be null
116 * @throw IllegalArgumentException thrown if member is null
117 */
118 public RelationMember(String role, OsmPrimitive member) throws IllegalArgumentException{
119 if (role == null) {
120 role = "";
121 }
122 if (member == null)
123 throw new IllegalArgumentException("Relation member cannot be null");
124 this.role = role;
125 this.member = member;
126 }
127
128 /**
129 * Copy constructor.
130 * This constructor is left only for backwards compatibility. Copying RelationMember doesn't make sense
131 * because it's immutable
132 * @param other relation member to be copied.
133 */
134 public RelationMember(RelationMember other) {
135 this(other.role, other.member);
136 }
137
138 @Override public String toString() {
139 return '"' + role + "\"=" + member;
140 }
141
142 /**
143 * Replies true, if this relation member refers to the primitive
144 *
145 * @param primitive the primitive to check
146 * @return true, if this relation member refers to the primitive
147 */
148 public boolean refersTo(OsmPrimitive primitive) {
149 return member == primitive;
150 }
151
152 @Override
153 public int hashCode() {
154 final int prime = 31;
155 int result = 1;
156 result = prime * result + member.hashCode();
157 result = prime * result + role.hashCode();
158 return result;
159 }
160
161 @Override
162 public boolean equals(Object obj) {
163 if (obj instanceof RelationMember) {
164 RelationMember other = (RelationMember) obj;
165 return member.equals(other.getMember()) && role.equals(other.getRole());
166 } else
167 return false;
168 }
169
170 /**
171 * PrimitiveId implementation. Returns the same value as getMember().getType()
172 */
173 public OsmPrimitiveType getType() {
174 return member.getType();
175 }
176
177 /**
178 * PrimitiveId implementation. Returns the same value as getMemberType().getUniqueId()
179 */
180 public long getUniqueId() {
181 return member.getUniqueId();
182 }
183
184 public boolean isNew() {
185 return member.isNew();
186 }
187 }