Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method ReceiveDataByChunk (NamedValueTree nvt_i, LibDEF_IntegrationEvent event_i) 
 | 
{ 
 | 
  Description: 'Receive a Data (by chunk) message with the chunked payload of a Set.' 
 | 
  TextBody: 
 | 
  [* 
 | 
    // Jacky CHAN Aug-3-2016 (created) 
 | 
    dataTransfer := null( LibDEF_DataTransfer ); 
 | 
    event        := event_i; 
 | 
     
 | 
    // check if initialization 
 | 
    isInit := LibDEF_DataAccessor::GetDataHeaderPropertyAsBoolean( nvt_i, LibDEF_DataAccessor::HEADER_ISINIT() ); 
 | 
     
 | 
    if( isInit ) 
 | 
    { 
 | 
      // extract DataTransfer 
 | 
      nvBody    := LibDEF_DataAccessor::GetDataBody( nvt_i ); 
 | 
      handleDT  := nvt_i.GetHandle( typeof( LibDEF_DataTransfer ).Name() ); 
 | 
      nodeDT    := nvBody.Child( handleDT ); 
 | 
      dt        := NamedValueTreeIO::ImportObject( nvt_i, nodeDT, typeof( LibDEF_DataTransfer ) ).astype( LibDEF_DataTransfer ); 
 | 
     
 | 
      dataTransfer := this.DataBroker().QueueInbox().DataTransfer( relinsert, &dt ); 
 | 
      dataTransfer.ExternalSystem  ( relset, this ); 
 | 
      dataTransfer.IntegrationEvent( relset, event ); 
 | 
     
 | 
      // link SetMeta 
 | 
      setGUID := LibDEF_DataAccessor::GetDataHeaderPropertyAsString( nvt_i, LibDEF_DataAccessor::HEADER_SETGUID() ); 
 | 
      setMeta := select( this, DataBroker.System.SetTypeMeta.SetMeta, sm, sm.GUID() = setGUID ); 
 | 
     
 | 
      if( not isnull( setMeta ) ) 
 | 
      { 
 | 
        dataTransfer.SetMeta( relset, setMeta ); 
 | 
        LibDEF_Util::EventLog( event, "Created data transfer [GUID: " + dataTransfer.GUID() + "]." ); 
 | 
      } 
 | 
      else 
 | 
      { 
 | 
        // log error 
 | 
        LibDEF_Util::EventLogError( event, "Creating DataTransfer", 
 | 
                                           "Failed due to SetMeta [GUID: " + setGUID + "] does not exist." ); 
 | 
      } 
 | 
    } 
 | 
    else 
 | 
    { 
 | 
      // store chunked payload 
 | 
      transferGUID := LibDEF_DataAccessor::GetDataHeaderPropertyAsString( nvt_i, LibDEF_DataAccessor::HEADER_DATATRANSFERGUID() ); 
 | 
      dataTransfer := select( this, DataTransfer, dt, dt.GUID() = transferGUID ); 
 | 
     
 | 
      if( not isnull( dataTransfer ) ) 
 | 
      { 
 | 
        // delete the newly created event for subsequent messages 
 | 
        event_i.Delete(); 
 | 
        event := dataTransfer.IntegrationEvent(); 
 | 
       
 | 
        sequenceNr := LibDEF_DataAccessor::GetDataHeaderPropertyAsNumber( nvt_i, LibDEF_DataAccessor::HEADER_SEQUENCENR() ); 
 | 
        chunkChecksum := LibDEF_DataAccessor::GetDataHeaderPropertyAsBinaryValue( nvt_i, LibDEF_DataAccessor::HEADER_CHUNK_CHECKSUM() ); 
 | 
        dataPiece  := select( dataTransfer, DataPiece, piece, piece.SequenceNr() = sequenceNr ); 
 | 
        chunkedPayload := LibDEF_DataAccessor::GetDataBodyPropertyAsBinaryValue( nvt_i, LibDEF_DataAccessor::HEADER_CHUNKDATA() ); 
 | 
         
 | 
        if( isnull( dataPiece ) ) 
 | 
        { 
 | 
          dataPiece := LibDEF_DataPiece::Create( dataTransfer, sequenceNr, chunkedPayload, chunkChecksum ); 
 | 
        } 
 | 
     
 | 
        if( not isnull( dataPiece ) ) 
 | 
        { 
 | 
          if( dataPiece.CheckChecksum() ) // check integrity before marking as completed 
 | 
          { 
 | 
            dataPiece.IsCompleted( true ); 
 | 
            LibDEF_Util::EventLog( event, "Buffered data piece sequence-nr #" + [String]sequenceNr + " of data transfer [GUID: " + transferGUID + "]." ); 
 | 
          } 
 | 
          else 
 | 
          { 
 | 
            LibDEF_Util::EventLogError( event, "Buffering DataPiece", 
 | 
                                        "Failed due to DataPiece of SequenceNr #" 
 | 
                                        + [String]dataPiece.SequenceNr() 
 | 
                                        + " of data transfer [GUID: " 
 | 
                                        + dataPiece.DataTransfer().GUID() 
 | 
                                        + "] being corrupted (mismatched checksum)." ); 
 | 
          } 
 | 
        } 
 | 
        else 
 | 
        { 
 | 
          // log error 
 | 
          LibDEF_Util::EventLogError( event, "Buffering DataPiece", 
 | 
                                             "Failed due to DataPiece of SequenceNr #" + [String]sequenceNr + " does not exist." ); 
 | 
        } 
 | 
      } 
 | 
      else 
 | 
      { 
 | 
        // log error 
 | 
        LibDEF_Util::EventLogError( event, "Processing DataTransfer", 
 | 
                                           "Failed due to DataTransfer [GUID: " + transferGUID + "] does not exist." ); 
 | 
      } 
 | 
     
 | 
      // check if DataTransfer is completed, then process it normally 
 | 
      if( dataTransfer.HasCompleted() ) 
 | 
      { 
 | 
        dsDataset := LibDEF_DataBroker::GetDataset();         
 | 
        dsDataset->ProcessCompletedChunkedData( dataTransfer, nvt_i, event ); 
 | 
      } 
 | 
    } 
 | 
  *] 
 | 
} 
 |