// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.data.osm;
import java.util.Collection;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
public class RelationToChildReference {
/**
* Replies a set of all {@link RelationToChildReference}s for a given child primitive.
*
* @param child the child primitive
* @return a set of all {@link RelationToChildReference}s for a given child primitive
*/
public static Set<RelationToChildReference> getRelationToChildReferences(OsmPrimitive child) {
Set<Relation> parents = OsmPrimitive.getFilteredSet(child.getReferrers(), Relation.class);
Set<RelationToChildReference> references = new HashSet<>();
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 {@link RelationToChildReference}s for a collection of child primitives
*
* @param children the collection of child primitives
* @return a set of all {@link RelationToChildReference}s to the children in the collection of child
* primitives
*/
public static Set<RelationToChildReference> getRelationToChildReferences(Collection<? extends OsmPrimitive> children) {
Set<RelationToChildReference> references = new HashSet<>();
for (OsmPrimitive child: children) {
references.addAll(getRelationToChildReferences(child));
}
return references;
}
private final Relation parent;
private final int position;
private final String role;
private final 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 boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
RelationToChildReference that = (RelationToChildReference) obj;
return position == that.position &&
Objects.equals(parent, that.parent) &&
Objects.equals(role, that.role) &&
Objects.equals(child, that.child);
}
@Override
public int hashCode() {
return Objects.hash(parent, position, role, child);
}
}