docs: private void initialize(byte[] prologue
                           ,int prologueOffset
                           ,JMFSchema headerSchema
                           ,byte rawHeader[]
                           ,int hdrOffset
                           ,int hdrLength
                           ,JMFSchema payloadSchema
                           ,byte rawPayload[]
                           ,int payOffset
                           ,int payLength
                           ,CommsConnection conn)
        throws MessageDecodeFailedException {
  
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.entry(this, tc, "initialize", new Object[]
                                                                            {prologue
                                                                            ,prologueOffset
                                                                            ,headerSchema
                                                                            ,rawHeader
                                                                            ,hdrOffset
                                                                            ,hdrLength
                                                                            ,payloadSchema
                                                                            ,rawPayload
                                                                            ,payOffset
                                                                            ,payLength
                                                                            ,conn
                                                                            });
  
      // Construct the initial JMF message.  If  raw buffer(s) were provided we decode the message
      // parts from the buffer(s).........
      if (rawHeader != null) {
  
        boolean separatePrologue = ( prologue!=null ? true : false);
  
        // If debug trace, dump the buffers first
        if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "Decoding message from byte buffer(s)");
        if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
          String outP = null;
          if (separatePrologue) {
            outP = SibTr.formatBytes(prologue, prologueOffset, PROLOGUE_LENGTH);
          }
          String out0 = SibTr.formatBytes(rawHeader, hdrOffset, hdrLength);
          String out1 = null;
          if (rawPayload != null) {
            out1 = SibTr.formatBytes(rawPayload, payOffset, payLength, MfpDiagnostics.getDiagnosticDataLimitInt());
          }
          SibTr.debug(this, tc, "buffers: ", new Object[] { outP, out0, out1 });
        }
  
        // Sanity check the length of the header section
        if (rawHeader.length-hdrOffset < hdrLength || hdrLength < IDS_LENGTH + ArrayUtil.INT_SIZE) {
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "Message buffer size too small: "+rawHeader.length);
          throw new MessageDecodeFailedException("Invalid message buffer (buffer size too small)");
        }
  
        // If there is a separate prologue, the JMFVersions, schemaIds & real header length will be there
        byte[] pBuffer;
        int pOffset;
        if (separatePrologue) {
          pBuffer = prologue;
          pOffset = prologueOffset;
        }
        // otherwise, the stuff will be at the front of the the header pBuffer
        else {
          pBuffer = rawHeader;
          pOffset = hdrOffset;
        }
  
        // Read in the Prologue information from the appropriate pBuffer
        short jmfVer1 = ArrayUtil.readShort(pBuffer, pOffset);
        pOffset += ArrayUtil.SHORT_SIZE;
        long encId1 = ArrayUtil.readLong(pBuffer, pOffset);
        pOffset += ArrayUtil.LONG_SIZE;
        short jmfVer2 = ArrayUtil.readShort(pBuffer, pOffset);
        pOffset += ArrayUtil.SHORT_SIZE;
        long encId2 = ArrayUtil.readLong(pBuffer, pOffset);
        pOffset += ArrayUtil.LONG_SIZE;
        int realHdrLength = ArrayUtil.readInt(pBuffer, pOffset);
        pOffset += ArrayUtil.INT_SIZE;
  
        // If the prologue was in the header buffer, update the offset now we have read it.
        if (!separatePrologue) {
          hdrOffset = pOffset;
        }
  
        // Save the original encoded message length
        originalLength = PROLOGUE_LENGTH + realHdrLength + payLength;
  
        // Decode the header
        headerPart = new JsMsgPart(initializePart(headerSchema, jmfVer1, encId1, rawHeader, hdrOffset, realHdrLength, conn));
  
        try {
          // Decode the payload if present
          if (payLength > 0) {
            payloadPart = new JsMsgPart(initializePart(payloadSchema, jmfVer2, encId2, rawPayload, payOffset, payLength, conn));
          }
        }
        catch (MessageDecodeFailedException e) {
          // No FFDC code needed
          // Just write out the decoded header to any debug trace and rethrow the Exception.
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "Decoded JMF Message Header", debugHeaderPart());
          throw e;
        }
  
        if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "Decoded JMF Message", debugMsg());
      }
  
      // .... If no buffers, we create new empty message parts.
      else if (headerSchema != null) {
        if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "Creating new empty header message: Schema="+debugSchema(headerSchema));
        headerPart = new JsMsgPart(JMFRegistry.instance.newMessage(headerSchema));
        if (payloadSchema != null) {
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "Creating new empty payload: Schema="+debugSchema(payloadSchema));
          payloadPart = new JsMsgPart(JMFRegistry.instance.newMessage(payloadSchema));
        }
      }
  
      /* It is legitimate for both the schema and the buffer to be null. The  */
      /* JMO is not initialized, which is correct for use by getCopy().       */
  
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.exit(this, tc, "initialize");
    }