docs: public LogRecord readNext()
                      throws ObjectManagerException
      {
          if (Tracing.isAnyTracingEnabled() && trace.isEntryEnabled())
              trace.entry(this,
                          cclass,
                          "readNext");
  
          java.io.DataInputStream logRecordDataInputStream;
          int type; // Of the Log Record.
          // Supress log Records until we see Checkpoint Start. Just build up the 
          // parts of any log Records.
          do {
              logRecordDataInputStream = readNextLogRecord();
              // We now have a java.io.DataInputStream containg a complete logRecord.       
              try {
                  type = logRecordDataInputStream.readInt();
              } catch (java.io.IOException exception) {
                  // No FFDC Code Needed.
                  ObjectManager.ffdc.processException(cclass, "readNext", exception, "1:160:1.13");
  
                  if (Tracing.isAnyTracingEnabled() && trace.isEntryEnabled())
                      trace.exit(this,
                                 cclass,
                                 "readNext",
                                 exception);
                  throw new PermanentIOException(this,
                                                 exception);
              } // catch java.io.IOException.
              if (type == LogRecord.TYPE_CHECKPOINT_START)
                  checkpointStartSeen = true;
          } while (!checkpointStartSeen);
  
          LogRecord logRecordRead = null; // The log record read from the log. 
          switch (type) {
              case LogRecord.TYPE_USER_DEFINED:
                  logRecordRead = LogRecord.getUserLogRecord(logRecordDataInputStream, objectManagerState);
                  break;
              case LogRecord.TYPE_ADD:
                  logRecordRead = new TransactionAddLogRecord(logRecordDataInputStream
                                                              , objectManagerState
                                  );
                  break;
              case LogRecord.TYPE_REPLACE:
                  logRecordRead = new TransactionReplaceLogRecord(logRecordDataInputStream
                                                                  , objectManagerState
                                  );
                  break;
              case LogRecord.TYPE_OPTIMISTIC_REPLACE:
                  logRecordRead = new TransactionOptimisticReplaceLogRecord(logRecordDataInputStream
                                                                            , objectManagerState
                                  );
                  break;
              case LogRecord.TYPE_DELETE:
                  logRecordRead = new TransactionDeleteLogRecord(logRecordDataInputStream
                                                                 , objectManagerState
                                  );
                  break;
              case LogRecord.TYPE_PREPARE:
                  logRecordRead = new TransactionPrepareLogRecord(logRecordDataInputStream
                                  );
                  break;
              case LogRecord.TYPE_COMMIT:
                  logRecordRead = new TransactionCommitLogRecord(logRecordDataInputStream);
                  break;
              case LogRecord.TYPE_BACKOUT:
                  logRecordRead = new TransactionBackoutLogRecord(logRecordDataInputStream);
                  break;
              case LogRecord.TYPE_CHECKPOINT_START:
                  logRecordRead = new CheckpointStartLogRecord(logRecordDataInputStream
                                                               , objectManagerState
                                  );
                  break;
              case LogRecord.TYPE_CHECKPOINT_END:
                  logRecordRead = new CheckpointEndLogRecord(logRecordDataInputStream);
                  break;
              case LogRecord.TYPE_CHECKPOINT_TRANSACTION:
                  logRecordRead = new TransactionCheckpointLogRecord(logRecordDataInputStream
                                                                     , objectManagerState
                                  );
                  break;
              case LogRecord.TYPE_PADDING:
                  logRecordRead = new PaddingLogRecord(logRecordDataInputStream);
                  break;
              default:
                  InvalidLogRecordTypeException invalidLogRecordTypeException = new InvalidLogRecordTypeException(this
                                                                                                                  , type
                                  );
                  ObjectManager.ffdc.processException(cclass, "readNext", invalidLogRecordTypeException, "1:229:1.13");
  
                  if (Tracing.isAnyTracingEnabled() && trace.isEntryEnabled())
                      trace.exit(this, cclass
                                 , "readNext"
                                 , new Object[] { invalidLogRecordTypeException, logRecordDataInputStream, new Integer(type) }
                                      );
                  throw invalidLogRecordTypeException;
          } // switch (type).
  
          if (Tracing.isAnyTracingEnabled() && trace.isEntryEnabled())
              trace.exit(this,
                         cclass,
                         "readNext",
                         new Object[] { logRecordRead });
          return logRecordRead;
      }