package net.osmand.osm; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; public class PoiFilter extends AbstractPoiType { private PoiCategory pc; private List<PoiType> poiTypes = new ArrayList<PoiType>(); private Map<String, PoiType> map = new LinkedHashMap<String, PoiType>(); public PoiFilter(MapPoiTypes registry, PoiCategory pc, String keyName){ super(keyName, registry); this.pc = pc; } public PoiCategory getPoiCategory() { return pc; } public PoiType getPoiTypeByKeyName(String kn) { return map.get(kn); } public void addPoiType(PoiType type) { if(!map.containsKey(type.getKeyName())) { poiTypes.add(type); map.put(type.getKeyName(), type); } else { PoiType prev = map.get(type.getKeyName()); if(prev.isReference()) { poiTypes.remove(prev); poiTypes.add(type); map.put(type.getKeyName(), type); } } } public Map<PoiCategory, LinkedHashSet<String>> putTypes(Map<PoiCategory, LinkedHashSet<String>> acceptedTypes) { if (!acceptedTypes.containsKey(pc)) { acceptedTypes.put(pc, new LinkedHashSet<String>()); } LinkedHashSet<String> set = acceptedTypes.get(pc); for (PoiType pt : poiTypes) { set.add(pt.getKeyName()); } addReferenceTypes(acceptedTypes); return acceptedTypes; } protected void addReferenceTypes(Map<PoiCategory, LinkedHashSet<String>> acceptedTypes) { for (PoiType pt : getPoiTypes()) { if (pt.isReference()) { PoiCategory refCat = pt.getReferenceType().getCategory(); if (!acceptedTypes.containsKey(refCat)) { acceptedTypes.put(refCat, new LinkedHashSet<String>()); } LinkedHashSet<String> ls = acceptedTypes.get(refCat); if (ls != null) { ls.add(pt.getKeyName()); } } } } public List<PoiType> getPoiTypes() { return poiTypes; } }