Quintiq file version 2.0
|
#parent: #root
|
Method SendDataByChunkOnSuccess (NamedValueTree nvt_i, LibDEF_DataTransfer dataTransfer_i, String messageKind_i,
|
String messageType_i)
|
{
|
Description: 'Send a Data (by chunk) message with the chunked payload of a Set.'
|
TextBody:
|
[*
|
// Jacky CHAN Aug-2-2016 (created)
|
event := dataTransfer_i.IntegrationEvent();
|
isInit := LibDEF_DataAccessor::GetDataHeaderPropertyAsBoolean( nvt_i, LibDEF_DataAccessor::HEADER_ISINIT() );
|
|
if( isInit )
|
{
|
// if set updated, chunking already done before sending the data transfer, thus no need to be done
|
if( not messageType_i = LibDEF_DataAccessor::TYPE_DATA_SETUPDATEDCHUNKED()
|
and not messageType_i = LibDEF_DataAccessor::TYPE_DATA_SETCREATEDCHUNKED() )
|
{
|
// Get the payload to be chunked
|
nvtPayload := null( NamedValueTree, owning );
|
if( LibDEF_DataAccessor::GetInternalMessageHeaderPropertyAsString( nvt_i, LibDEF_DataAccessor::HEADER_TYPE() ) = LibDEF_DataAccessor::TYPE_INTERNALMESSAGE_PAYLOADTOCHUNK() )
|
{
|
nvtPayload := LibDEF_DataAccessor::GetInternalMessageBodyNvt( nvt_i );
|
}
|
|
// Give error if there is no payload to be chunked
|
if( isnull( nvtPayload ) )
|
{
|
LibDEF_Util::EventLogError( event,
|
"Failed to chunk payload.",
|
"The given NVT payload is null. Please check that the InternalMessage in the NVT is filled in with the payload to be chunked." );
|
}
|
else
|
{
|
// Chunk the payload and create data pieces
|
LibDEF_Util::EventLog( dataTransfer_i.IntegrationEvent(), "Preparing data pieces (chunking NVT)." );
|
dataTransfer_i.CreateDataPieces( nvtPayload );
|
}
|
}
|
}
|
else
|
{
|
// mark the last DataPiece as completed
|
lastSeqNr := LibDEF_DataAccessor::GetDataHeaderPropertyAsNumber( nvt_i, LibDEF_DataAccessor::HEADER_SEQUENCENR() );
|
lastDataPiece := select( dataTransfer_i, DataPiece, piece,
|
piece.SequenceNr() = lastSeqNr );
|
if( not isnull( lastDataPiece ) )
|
{
|
lastDataPiece.IsCompleted( true );
|
}
|
}
|
|
if( dataTransfer_i.CanExecute() )
|
{
|
// get the chunk of payload using SubString
|
nextDataPiece := dataTransfer_i.GetNextDataPiece();
|
|
if( not isnull( nextDataPiece ) )
|
{
|
// send the next DataPiece
|
nvt := LibDEF_DataAccessor::CreateMessageData();
|
|
// Fill in the body of NVT with the next data piece.
|
LibDEF_DataAccessor::SetDataBodyProperty( nvt, LibDEF_DataAccessor::HEADER_CHUNKDATA(), nextDataPiece.Payload() );
|
|
// add headers
|
datasetMDSID := LibDEF_DataAccessor::GetDataHeaderPropertyAsKey( nvt_i, LibDEF_DataAccessor::HEADER_DATASETMDSID() );
|
datasetDTD := LibDEF_DataAccessor::GetDataHeaderPropertyAsKey( nvt_i, LibDEF_DataAccessor::HEADER_DATASETDTD() );
|
datasetType := LibDEF_DataAccessor::GetDataHeaderPropertyAsString( nvt_i, LibDEF_DataAccessor::HEADER_DATASETMODELTYPE() );
|
LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_TYPE(), messageType_i );
|
LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_SETTYPEGUID(), dataTransfer_i.SetMeta().SetTypeMeta().GUID() );
|
LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_SETGUID(), dataTransfer_i.SetMeta().GUID() );
|
LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_SETLASTUPDATED(), dataTransfer_i.SetMeta().LastUpdated() );
|
LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_DATASETMDSID(), datasetMDSID );
|
LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_DATASETDTD(), datasetDTD );
|
LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_DATASETMODELTYPE(), datasetType );
|
|
// add extra Header related to chunking
|
LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_ISINIT(), false );
|
LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_DATATRANSFERGUID(), dataTransfer_i.GUID() );
|
LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_SEQUENCENR(), nextDataPiece.SequenceNr() );
|
LibDEF_DataAccessor::SetDataHeaderProperty( nvt, LibDEF_DataAccessor::HEADER_CHUNK_CHECKSUM(), nextDataPiece.PayloadChecksum() );
|
|
// use ChannelMeta of the sender
|
channelName := dataTransfer_i.SetMeta().ChannelName();
|
channelMeta := select( this, DataBroker.SystemLocal.ChannelMeta, localCM,
|
localCM.Name() = channelName );
|
eventTitle := "Sending GetSet data piece sequence-nr #" + [String]nextDataPiece.SequenceNr() + ", total number of pieces is " + [String]dataTransfer_i.GetNumberOfDataPieces() + ".";
|
|
if( not isnull( channelMeta ) )
|
{
|
LibDEF_Util::EventLog( event, eventTitle );
|
|
// send the data-chunk message
|
this.DataBroker().SendData( this, nvt, messageKind_i, event, channelMeta.Name(), channelMeta.MajorVersion(), channelMeta.MinorVersion() );
|
}
|
else
|
{
|
LibDEF_Util::EventLogError( event, eventTitle, "Failed due to Channel " + channelName + " not found." );
|
}
|
}
|
else
|
{
|
// all pieces have been sent
|
LibDEF_Util::EventLog( event, "Sending of Set [GUID: " + dataTransfer_i.SetMeta().GUID() +
|
"] to the System [GUID: " + dataTransfer_i.ExternalSystem().GUID() +
|
"] in Chunked mode has completed." );
|
|
LibDEF_IntegrationEvent::EventComplete( event );
|
}
|
}
|
else
|
{
|
// log error and terminate subsequent sending
|
LibDEF_Util::EventLogError( event, "Data transfer failed.",
|
"Data transfer of sending Set [GUID: " + dataTransfer_i.SetMeta().GUID() +
|
"] to System [GUID: " + dataTransfer_i.ExternalSystem().GUID() +
|
"] is interrupted." );
|
}
|
*]
|
}
|