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 }