package aimax.osm.data.impl; import java.util.Arrays; import java.util.List; import aimax.osm.data.EntityVisitor; import aimax.osm.data.entities.EntityAttribute; import aimax.osm.data.entities.EntityViewInfo; import aimax.osm.data.entities.MapEntity; /** * Base class for all map entities in this default map representation * implementation. * @author Ruediger Lunde */ public abstract class DefaultMapEntity implements MapEntity { private static final EntityAttribute[] EMPTY_ATT_LIST = new EntityAttribute[0]; protected long id; protected String name; protected EntityAttribute[] attributes; volatile protected EntityViewInfo viewInfo; protected DefaultMapEntity() { attributes = EMPTY_ATT_LIST; } /** {@inheritDoc} */ public long getId() { return id; } /** {@inheritDoc} */ public void setId(int id) { this.id = id; } /** Returns the name of the entity or null. */ public String getName() { return name; } /** {@inheritDoc} */ public void setName(String name) { this.name = name; } /** {@inheritDoc} */ public EntityAttribute[] getAttributes() { return attributes; } /** {@inheritDoc} */ public void setAttributes(List<EntityAttribute> atts) { if (!atts.isEmpty() || attributes.length != 0) { attributes = new EntityAttribute[atts.size()]; atts.toArray(attributes); Arrays.sort(attributes); } } /** {@inheritDoc} */ public EntityViewInfo getViewInfo() { return viewInfo; } /** {@inheritDoc} */ public void setViewInfo(EntityViewInfo renderData) { this.viewInfo = renderData; } /** * Applies binary search to find the specified attribute value and * returns null if not found. */ public String getAttributeValue(String attName) { int min = 0; int max = attributes.length-1; int curr; int cr; while (min <= max) { curr = (min+max)/2; cr = attName.compareTo(attributes[curr].getKey()); if (cr == 0) return attributes[curr].getValue(); else if (cr < 0) max = curr-1; else min = curr+1; } return null; } /** {@inheritDoc} */ public abstract void accept(EntityVisitor visitor); ///////////////////////////////////////////////////////////////// // extension for kd-tree /** * Returns -1, if all parts of the entity have * a lower latitude than <code>lat</code>; * 1 if no part has a higher latitude than <code>lat</code>; * an 0 otherwise. * @param lat Defines the split plane. * @return -1, 0, or 1 */ public abstract int compareLatitude(float lat); /** * Returns -1, if all parts of the entity have * a lower longitude than <code>lon</code>; * 1 if no part has a higher longitude than <code>lon</code>; * an 0 otherwise. * @param lon Defines the split plane. * @return -1, 0, or 1 */ public abstract int compareLongitude(float lon); }