// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.data.osm; import java.util.Collection; import java.util.HashSet; import java.util.Set; public class RelationToChildReference { /** * Replies a set of all {@see RelationToChildReference}s for a given child primitive. * * @param child the child primitive * @return a set of all {@see RelationToChildReference}s for a given child primitive */ static public Set<RelationToChildReference> getRelationToChildReferences(OsmPrimitive child) { Set<Relation> parents = OsmPrimitive.getFilteredSet(child.getReferrers(), Relation.class); Set<RelationToChildReference> references = new HashSet<RelationToChildReference>(); for (Relation parent: parents) { for (int i=0; i < parent.getMembersCount(); i++) { if (parent.getMember(i).refersTo(child)) { references.add(new RelationToChildReference(parent, i, parent.getMember(i))); } } } return references; } /** * Replies a set of all {@see RelationToChildReference}s for a collection of child primitives * * @param children the collection of child primitives * @return a set of all {@see RelationToChildReference}s to the children in the collection of child * primitives */ static public Set<RelationToChildReference> getRelationToChildReferences(Collection<? extends OsmPrimitive> children) { Set<RelationToChildReference> references = new HashSet<RelationToChildReference>(); for (OsmPrimitive child: children) { references.addAll(getRelationToChildReferences(child)); } return references; } private Relation parent; private int position; private String role; private OsmPrimitive child; public RelationToChildReference(Relation parent, int position, String role, OsmPrimitive child) { this.parent = parent; this.position = position; this.role = role; this.child = child; } public RelationToChildReference(Relation parent, int position, RelationMember member) { this.parent = parent; this.position = position; this.role = member.getRole(); this.child = member.getMember(); } public Relation getParent() { return parent; } public int getPosition() { return position; } public String getRole() { return role; } public OsmPrimitive getChild() { return child; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((child == null) ? 0 : child.hashCode()); result = prime * result + ((parent == null) ? 0 : parent.hashCode()); result = prime * result + position; result = prime * result + ((role == null) ? 0 : role.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; RelationToChildReference other = (RelationToChildReference) obj; if (child == null) { if (other.child != null) return false; } else if (!child.equals(other.child)) return false; if (parent == null) { if (other.parent != null) return false; } else if (!parent.equals(other.parent)) return false; if (position != other.position) return false; if (role == null) { if (other.role != null) return false; } else if (!role.equals(other.role)) return false; return true; } }