package net.osmand.osm.edit;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import net.osmand.data.LatLon;
import net.osmand.osm.edit.Entity.EntityId;
import net.osmand.osm.edit.Relation.RelationMember;
public class Relation extends Entity {
public static class RelationMember {
private EntityId entityId;
private Entity entity;
private String role;
public RelationMember(EntityId entityId, String role) {
this.entityId = entityId;
this.role = role;
}
public EntityId getEntityId() {
if(entityId == null && entity != null) {
return EntityId.valueOf(entity);
}
return entityId;
}
public String getRole() {
return role;
}
public Entity getEntity() {
return entity;
}
@Override
public String toString() {
return entityId.toString() + " " + role;
}
}
// lazy loading
List<RelationMember> members = null;
public Relation(long id) {
super(id);
}
public void addMember(Long id, EntityType type, String role){
if(members == null){
members = new ArrayList<>();
}
members.add(new RelationMember(new EntityId(type, id), role));
}
public List<RelationMember> getMembers(String role) {
if (members == null) {
return Collections.emptyList();
}
if (role == null) {
return members;
}
List<RelationMember> l = new ArrayList<>();
for (RelationMember m : members) {
if (role.equals(m.role)) {
l.add(m);
}
}
return l;
}
public List<Entity> getMemberEntities(String role) {
if (members == null) {
return Collections.emptyList();
}
List<Entity> l = new ArrayList<>();
for (RelationMember m : members) {
if (role == null || role.equals(m.role)) {
if(m.entity != null) {
l.add(m.entity);
}
}
}
return l;
}
public List<RelationMember> getMembers() {
if(members == null){
return Collections.emptyList();
}
return members;
}
@Override
public void initializeLinks(Map<EntityId, Entity> entities){
if (members != null) {
for(RelationMember rm : members) {
if(rm.entityId != null && entities.containsKey(rm.entityId)) {
rm.entity = entities.get(rm.entityId);
}
}
}
}
@Override
public LatLon getLatLon() {
return null;
}
public boolean remove(EntityId key) {
if(members != null) {
Iterator<RelationMember> it = members.iterator();
while(it.hasNext()) {
RelationMember rm = it.next();
if(key.equals(rm.getEntityId())) {
return true;
}
}
}
return false;
}
public boolean remove(RelationMember key) {
if(members != null) {
Iterator<RelationMember> it = members.iterator();
while(it.hasNext()) {
RelationMember rm = it.next();
if(rm == key) {
it.remove();
return true;
}
}
}
return false;
}
}