code: void preProcessOperation(Operation operation) throws ContainerException, StreamSegmentException {
          log.trace("{}: PreProcess {}.", this.traceObjectId, operation);
          getOrCreateTransaction().preProcessOperation(operation);
      }
docs: Phase 1/2 of processing a Operation.
  
  If the given operation is a StorageOperation, the Operation is validated against the base Container Metadata and
  the pending UpdateTransaction and it is updated accordingly (if needed).
  
  If the given operation is a MetadataCheckpointOperation, the current state of the metadata (including pending
  UpdateTransactions) is serialized to it.
  
  For all other kinds of MetadataOperations (i.e., StreamSegmentMapOperation) this method only
  does anything if the base Container Metadata is in Recovery Mode (in which case the given MetadataOperation) is
  recorded in the pending UpdateTransaction.
  
  @param operation The operation to pre-process.
  @throws ContainerException              If the given operation was rejected given the current state of the container
  metadata or most recent UpdateTransaction.
  @throws StreamSegmentNotExistsException If the given operation was for a Segment that was is marked as deleted.
  @throws StreamSegmentSealedException    If the given operation was for a Segment that was previously sealed and
  that is incompatible with a sealed Segment.
  @throws StreamSegmentMergedException    If the given operation was for a Segment that was previously merged.
  @throws NullPointerException            If the operation is null.