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    }