001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.data.osm;
003    
004    import java.util.Collection;
005    import java.util.HashSet;
006    import java.util.Set;
007    
008    public class RelationToChildReference {
009    
010        /**
011         * Replies a set of all {@link RelationToChildReference}s for a given child primitive.
012         *
013         * @param child the child primitive
014         * @return  a set of all {@link RelationToChildReference}s for a given child primitive
015         */
016        static public Set<RelationToChildReference> getRelationToChildReferences(OsmPrimitive child) {
017            Set<Relation> parents = OsmPrimitive.getFilteredSet(child.getReferrers(), Relation.class);
018            Set<RelationToChildReference> references = new HashSet<RelationToChildReference>();
019            for (Relation parent: parents) {
020                for (int i=0; i < parent.getMembersCount(); i++) {
021                    if (parent.getMember(i).refersTo(child)) {
022                        references.add(new RelationToChildReference(parent, i, parent.getMember(i)));
023                    }
024                }
025            }
026            return references;
027        }
028    
029        /**
030         * Replies a set of all {@link RelationToChildReference}s for a collection of child primitives
031         *
032         * @param children the collection of child primitives
033         * @return  a set of all {@link RelationToChildReference}s to the children in the collection of child
034         * primitives
035         */
036        static public Set<RelationToChildReference> getRelationToChildReferences(Collection<? extends OsmPrimitive> children) {
037            Set<RelationToChildReference> references = new HashSet<RelationToChildReference>();
038            for (OsmPrimitive child: children) {
039                references.addAll(getRelationToChildReferences(child));
040            }
041            return references;
042        }
043    
044        private Relation parent;
045        private int position;
046        private String role;
047        private OsmPrimitive child;
048    
049        public RelationToChildReference(Relation parent, int position, String role, OsmPrimitive child) {
050            this.parent = parent;
051            this.position = position;
052            this.role = role;
053            this.child = child;
054        }
055    
056        public RelationToChildReference(Relation parent, int position, RelationMember member) {
057            this.parent = parent;
058            this.position = position;
059            this.role = member.getRole();
060            this.child = member.getMember();
061        }
062    
063        public Relation getParent() {
064            return parent;
065        }
066    
067        public int getPosition() {
068            return position;
069        }
070    
071        public String getRole() {
072            return role;
073        }
074    
075        public OsmPrimitive getChild() {
076            return child;
077        }
078    
079        @Override
080        public int hashCode() {
081            final int prime = 31;
082            int result = 1;
083            result = prime * result + ((child == null) ? 0 : child.hashCode());
084            result = prime * result + ((parent == null) ? 0 : parent.hashCode());
085            result = prime * result + position;
086            result = prime * result + ((role == null) ? 0 : role.hashCode());
087            return result;
088        }
089        @Override
090        public boolean equals(Object obj) {
091            if (this == obj)
092                return true;
093            if (obj == null)
094                return false;
095            if (getClass() != obj.getClass())
096                return false;
097            RelationToChildReference other = (RelationToChildReference) obj;
098            if (child == null) {
099                if (other.child != null)
100                    return false;
101            } else if (!child.equals(other.child))
102                return false;
103            if (parent == null) {
104                if (other.parent != null)
105                    return false;
106            } else if (!parent.equals(other.parent))
107                return false;
108            if (position != other.position)
109                return false;
110            if (role == null) {
111                if (other.role != null)
112                    return false;
113            } else if (!role.equals(other.role))
114                return false;
115            return true;
116        }
117    }