docs: private void convertBufferIfNeeded() {
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.entry(tc, "convertBufferIfNeeded status: " + status);
          }
  
          if (isFCEnabled()) {
  
              // TRANSFER_TO status is currently on, so turn if OFF
              status = status & (~WsByteBuffer.STATUS_TRANSFER_TO);
              // and turn on BUFFER status
              status = status | WsByteBuffer.STATUS_BUFFER;
  
              try {
                  // save so we can restore the current position
                  int bufPosition = (int) fc.position();
  
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "creating a MappedByteBuffer from the FileChannel. position: " + 0 + "  size: " + fc.size());
                  }
  
                  // map entire FileChannel buffer to ByteBuffer
                  try {
                      oByteBuffer = fc.map(MapMode.PRIVATE, 0, fc.size());
                  } catch (NonWritableChannelException e) {
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                          Tr.debug(tc, "FileChannel is readonly");
                      }
                      oByteBuffer = fc.map(MapMode.READ_ONLY, 0, fc.size());
                      setReadOnly(true);
                  }
  
                  // The mapped byte buffer returned by this method will have a
                  // position of zero and a limit and capacity of size;
                  // its mark will be undefined.
                  // The buffer and the mapping that it represents will
                  // remain valid until the buffer itself is garbage-collected.
  
                  // restore the position and limit
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "set MappedByteBuffer position to: " + bufPosition + " limit to: " + fcLimit);
                  }
                  position(bufPosition);
                  limit(fcLimit);
              } catch (IOException e) {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "got IOException: " + e);
                  }
                  FFDCFilter.processException(e, CLASS_NAME + ".convertBufferIfNeeded", "112", this);
                  throw new RuntimeException(e);
              }
          }
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
              Tr.exit(tc, "convertBufferIfNeeded status: " + status);
          }
      }