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 );
|
}
|
}
|
*]
|
}
|