docs: public int refreshBookmark(Object bookmark, int iHandleType, boolean bReReadMessage)
      {
          if (bookmark == null)
              return -1;
          int iTargetPosition = m_gridBuffer.bookmarkToIndex(bookmark, iHandleType);
          if (iTargetPosition != -1)
          { // Refresh the data in the buffer.
              Object objElement = m_gridBuffer.elementAt(iTargetPosition);
              if (objElement instanceof DataRecord)
              {   // The only thing that I know for sure is the bookmark is correct.
                  DataRecord dataRecord = (DataRecord)objElement;
                  dataRecord.setBuffer(null);
                  dataRecord.setHandle(null, DBConstants.BOOKMARK_HANDLE);
                  dataRecord.setHandle(null, DBConstants.OBJECT_ID_HANDLE);
                  dataRecord.setHandle(null, DBConstants.DATA_SOURCE_HANDLE);
                  dataRecord.setHandle(null, DBConstants.OBJECT_SOURCE_HANDLE);
                  dataRecord.setHandle(bookmark, iHandleType);
                  if (bReReadMessage)
                  {   // Re-read and refresh the cache.
                      try {
                          this.get(iTargetPosition);
                      } catch (DBException ex) {
                          ex.printStackTrace();
                      }
                  }
                  else
                  {
                      BaseTable table = this;
                      while (true)
                      {       // Search down the table links for a cache table and then clear the entry.
                          if (table == null)
                              break;
                          if (DBParams.CLIENT.equals(table.getSourceType()))
                              break;
                          if ((table instanceof PassThruTable)
                              && (((PassThruTable)table).getNextTable() != table))
                                  table = ((PassThruTable)table).getNextTable();
                          else if (table == table.getCurrentTable())
                              break;
                          else
                              table = table.getCurrentTable();
                      }
                      // Note: This works great unless there is a cached copy of the record, so invalidate remote cache copy.
                      if (DBParams.CLIENT.equals(table.getSourceType()))
                      {
                          org.jbundle.thin.base.db.client.CachedRemoteTable cacheTable = (org.jbundle.thin.base.db.client.CachedRemoteTable)table.getRemoteTableType(org.jbundle.thin.base.db.client.CachedRemoteTable.class);
                          if (cacheTable != null)
                              cacheTable.setCache(bookmark, null);    // Clear cache, so next read will do a physical read
                      }
                  }
              }
          }
          return iTargetPosition;   // Return index
      }