/**
   * Print a text to the log (usually derby.log), provided that verbose is true.
   *
   * @param text The text that will be logged
   * @param writeHeader if true, encapsulates message in "begin error message" and "end error
   *     message" lines. If false, timestamps the text and writes it to the log without the header
   *     and footer.
   */
  public void logText(String text, boolean writeHeader) {

    if (verbose) {
      if (writeHeader) {
        Monitor.logTextMessage(MessageId.REPLICATION_ERROR_BEGIN, new Date());
        Monitor.logMessage(text);
        Monitor.logTextMessage(MessageId.REPLICATION_ERROR_END);
      } else {
        Monitor.logTextMessage(MessageId.REPLICATION_ONELINE_MSG_HEADER, new Date(), text);
      }
    }
  }
  /**
   * Print error message and the stack trace of the throwable to the log (usually derby.log)
   * provided that verbose is true. If verbose is false, nothing is logged.
   *
   * @param msgId The error message id
   * @param t Error trace starts from this error
   */
  public void logError(String msgId, Throwable t) {

    if (verbose) {

      Monitor.logTextMessage(MessageId.REPLICATION_ERROR_BEGIN, new Date());

      if (msgId != null) {
        Monitor.logTextMessage(msgId, dbname);
      }

      if (t != null) {
        ErrorStringBuilder esb = new ErrorStringBuilder(Monitor.getStream().getHeader());
        esb.stackTrace(t);
        Monitor.logMessage(esb.get().toString());
        esb.reset();
      }
      Monitor.logTextMessage(MessageId.REPLICATION_ERROR_END);
    }
  }
  /**
   * Convert this page to requested type, as defined by input format id.
   *
   * <p>The current cache entry is a different format id than the requested type, change it. This
   * object is instantiated to the wrong subtype of cachedPage, this routine will create an object
   * with the correct subtype, and transfer all pertinent information from this to the new correct
   * object.
   *
   * <p>
   *
   * @return The new object created with the input fid and transfered info.
   * @param fid The format id of the new page.
   * @param newIdentity The key of the new page.
   * @exception StandardException Standard exception policy.
   */
  private CachedPage changeInstanceTo(int fid, PageKey newIdentity) throws StandardException {
    CachedPage realPage;

    try {
      realPage = (CachedPage) Monitor.newInstanceFromIdentifier(fid);

    } catch (StandardException se) {
      if (se.getSeverity() > ExceptionSeverity.STATEMENT_SEVERITY) {
        throw se;
      } else {
        throw StandardException.newException(
            SQLState.DATA_UNKNOWN_PAGE_FORMAT_2,
            newIdentity,
            org.apache.derby.iapi.util.StringUtil.hexDump(pageData));
      }
    }

    realPage.setFactory(dataFactory);

    // avoid creating the data buffer if possible, transfer it to the new
    // page if this is the first time the page buffer is used, then
    // createPage will create the page array with the correct page size
    if (this.pageData != null) {
      realPage.alreadyReadPage = true;
      realPage.usePageBuffer(this.pageData);
    }

    // RESOLVE (12/15/06) - the following code is commented out, but
    // not sure why.

    // this page should not be used any more, null out all its content and
    // wait for GC to clean it up

    // destroyPage();// let this subtype have a chance to get rid of stuff
    // this.pageData = null;	// this instance no longer own the data array
    // this.pageCache = null;
    // this.dataFactory = null;
    // this.containerCache = null;

    return realPage;
  }