package aimax.osm.data.impl; import java.util.ArrayList; import java.util.List; import aimax.osm.data.EntityFinder; import aimax.osm.data.OsmMap; import aimax.osm.data.MapWayFilter; import aimax.osm.data.Position; import aimax.osm.data.entities.MapEntity; /** * Base class suitable to implement different entity finders. Just the method * {@link #find(boolean)} has to be overridden. * * @author Ruediger Lunde */ public abstract class AbstractEntityFinder implements EntityFinder { protected static enum Mode { ENTITY, NODE, WAY, ADDRESS } private final OsmMap storage; private int minRadius; private int maxRadius; protected int nextRadius; protected Mode mode; protected String pattern; protected Position position; protected MapWayFilter wayFilter; private final List<MapEntity> intermediateResults; private final List<MapEntity> results; /** Creates a new entity finder for the given map data storage. */ public AbstractEntityFinder(OsmMap storage) { this.storage = storage; minRadius = 2; maxRadius = 16; nextRadius = -1; intermediateResults = new ArrayList<MapEntity>(); results = new ArrayList<MapEntity>(); } protected OsmMap getStorage() { return storage; } /** {@inheritDoc} */ @Override public int getMinRadius() { return minRadius; } /** {@inheritDoc} */ @Override public void setMinRadius(int km) { minRadius = km; } /** {@inheritDoc} */ @Override public int getMaxRadius() { return maxRadius; } /** {@inheritDoc} */ @Override public void setMaxRadius(int km) { maxRadius = km; } /** {@inheritDoc} */ @Override public void findEntity(String pattern, Position pos) { mode = Mode.ENTITY; this.pattern = pattern; position = pos; wayFilter = null; nextRadius = minRadius; clearResults(); find(false); } /** {@inheritDoc} */ @Override public void findNode(String pattern, Position pos) { mode = Mode.NODE; this.pattern = pattern; position = pos; nextRadius = minRadius; clearResults(); find(false); } /** {@inheritDoc} */ @Override public void findWay(String pattern, Position pos, MapWayFilter filter) { mode = Mode.WAY; this.pattern = pattern; position = pos; wayFilter = filter; nextRadius = minRadius; clearResults(); find(false); } /** {@inheritDoc} */ @Override public void findAddress(String pattern, Position pos) { mode = Mode.ADDRESS; this.pattern = pattern; position = pos; wayFilter = null; nextRadius = minRadius; clearResults(); find(false); } /** {@inheritDoc} */ @Override public boolean canFindMore() { return nextRadius != -1 || intermediateResults.size() == 1; } /** {@inheritDoc} */ @Override public void findMore() { find(true); } /** Abstract operation which makes the interesting work. */ protected abstract void find(boolean findMore); public Position getRefPosition() { return position; } /** {@inheritDoc} */ @Override public List<MapEntity> getIntermediateResults() { return intermediateResults; } /** {@inheritDoc} */ @Override public List<MapEntity> getResults() { return results; } /** {@inheritDoc} */ @Override public void selectIntermediateResult(MapEntity entity) { intermediateResults.clear(); intermediateResults.add(entity); } /** Clears results and sets the next search radius to the minimum radius. */ private void clearResults() { intermediateResults.clear(); results.clear(); } }