/** @see java.lang.Runnable#run() */
  public void run() {
    while (true) {
      Entry e = null;
      synchronized (s_queue) {
        if (s_queue.size() > 0) e = (Entry) s_queue.remove(0);
      }

      if (e != null) {
        try {
          if (e.listener != null) e.listener.preQuery(e);
          e.ds.getData(e.table, e.query, e.keyField, e.lock);
          if (e.listener != null) e.listener.postQuery(e);
        } catch (DataIOException dre) {
          s_logger.warning(dre.getMessage() + "\n" + StringLib.getStackTrace(dre));
        }
      } else {
        // nothing to do, chill out until notified
        try {
          synchronized (this) {
            wait();
          }
        } catch (InterruptedException ex) {
        }
      }
    }
  }
 /** @see javax.swing.table.TableModel#getValueAt(int, int) */
 public Object getValueAt(int rowIndex, int columnIndex) {
   Object o = m_table.get(getRow(rowIndex), columnIndex);
   if (o != null && o.getClass().isArray()) {
     return StringLib.getArrayString(o);
   } else {
     return o;
   }
 }
  /**
   * Perform a filtering check on the input item.
   *
   * @param item the item to check against the filter
   * @return true if the item should be considered, false otherwise
   */
  protected boolean filterCheck(VisualItem item) {
    if (filter == null) return true;

    try {
      return filter.getBoolean(item);
    } catch (Exception e) {
      Logger.getLogger(getClass().getName())
          .warning(e.getMessage() + "\n" + StringLib.getStackTrace(e));
      return false;
    }
  }