Skip to content

Commit

Permalink
Add IJsonEncoder/IJsonDecoder interfaces (#2042)
Browse files Browse the repository at this point in the history
- in order to abstract the implementation of a IEncoder/IDecoder  for Json with some extra methods and properties, derive JsonEncoder/Jsondecoder from a IJsonDecoder/IJsonEncoder interface
- breaking change: the use of reversible/non-reversible subencoding is handled by a new method:
`void UsingReversibleEncoding<T>(Action<string, T> action, string fieldName, T value, bool useReversibleEncoding)`
  • Loading branch information
mregen committed Jul 20, 2023
1 parent eaa3cb0 commit 0bf2e93
Show file tree
Hide file tree
Showing 8 changed files with 248 additions and 172 deletions.
34 changes: 16 additions & 18 deletions Libraries/Opc.Ua.PubSub/Encoding/JsonDataSetMessage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public class JsonDataSetMessage : UaDataSetMessage
/// Create new instance of <see cref="JsonDataSetMessage"/> with DataSet parameter
/// </summary>
/// <param name="dataSet"></param>
public JsonDataSetMessage(DataSet dataSet = null)
public JsonDataSetMessage(DataSet dataSet = null)
{
DataSet = dataSet;
}
Expand Down Expand Up @@ -105,9 +105,9 @@ public override void SetFieldContentMask(DataSetFieldContentMask fieldContentMas
/// <summary>
/// Encodes the dataset message
/// </summary>
/// <param name="jsonEncoder">The <see cref="JsonEncoder"/> used to encode this object.</param>
/// <param name="jsonEncoder">The <see cref="IJsonEncoder"/> used to encode this object.</param>
/// <param name="fieldName">The field name to be used to encode this object, by default it is null.</param>
public void Encode(JsonEncoder jsonEncoder, string fieldName = null)
public void Encode(IJsonEncoder jsonEncoder, string fieldName = null)
{
jsonEncoder.PushStructure(fieldName);
if (HasDataSetMessageHeader)
Expand All @@ -130,7 +130,7 @@ public void Encode(JsonEncoder jsonEncoder, string fieldName = null)
/// <param name="messagesCount">Number of Messages found in current jsonDecoder. If 0 then there is SingleDataSetMessage</param>
/// <param name="messagesListName">The name of the Messages list</param>
/// <param name="dataSetReader">The <see cref="DataSetReaderDataType"/> used to decode the data set.</param>
public void DecodePossibleDataSetReader(JsonDecoder jsonDecoder, int messagesCount, string messagesListName, DataSetReaderDataType dataSetReader)
public void DecodePossibleDataSetReader(IJsonDecoder jsonDecoder, int messagesCount, string messagesListName, DataSetReaderDataType dataSetReader)
{
if (messagesCount == 0)
{
Expand Down Expand Up @@ -169,7 +169,7 @@ public void DecodePossibleDataSetReader(JsonDecoder jsonDecoder, int messagesCou
// the dataset was decoded
return;
}

}
}
}
Expand All @@ -180,7 +180,7 @@ public void DecodePossibleDataSetReader(JsonDecoder jsonDecoder, int messagesCou
/// <summary>
/// Atempt to decode dataset from the KeyValue pairs
/// </summary>
private void DecodePossibleDataSetReader(JsonDecoder jsonDecoder, DataSetReaderDataType dataSetReader)
private void DecodePossibleDataSetReader(IJsonDecoder jsonDecoder, DataSetReaderDataType dataSetReader)
{
// check if there shall be a dataset header and decode it
if (HasDataSetMessageHeader)
Expand Down Expand Up @@ -209,7 +209,7 @@ private void DecodePossibleDataSetReader(JsonDecoder jsonDecoder, DataSetReaderD
{
DecodeErrorReason = ValidateMetadataVersion(dataSetReader.DataSetMetaData.ConfigurationVersion);

if ( (payload.Count > dataSetReader.DataSetMetaData.Fields.Count) ||
if ((payload.Count > dataSetReader.DataSetMetaData.Fields.Count) ||
IsMetadataMajorVersionChange)
{
// filter out payload that has more fields than the searched datasetMetadata or
Expand Down Expand Up @@ -246,7 +246,7 @@ private void DecodePossibleDataSetReader(JsonDecoder jsonDecoder, DataSetReaderD
/// <summary>
/// Decode the Content of the Payload and create a DataSet object from it
/// </summary>
private DataSet DecodePayloadContent(JsonDecoder jsonDecoder, DataSetReaderDataType dataSetReader)
private DataSet DecodePayloadContent(IJsonDecoder jsonDecoder, DataSetReaderDataType dataSetReader)
{
TargetVariablesDataType targetVariablesData =
ExtensionObject.ToEncodeable(dataSetReader.SubscribedDataSet)
Expand Down Expand Up @@ -425,7 +425,7 @@ private void EncodeDataSetMessageHeader(IEncoder encoder)
/// <summary>
/// Encodes The DataSet message payload
/// </summary>
internal void EncodePayload(JsonEncoder jsonEncoder, bool pushStructure = true)
internal void EncodePayload(IJsonEncoder jsonEncoder, bool pushStructure = true)
{
bool forceNamespaceUri = jsonEncoder.ForceNamespaceUri;

Expand Down Expand Up @@ -453,7 +453,7 @@ internal void EncodePayload(JsonEncoder jsonEncoder, bool pushStructure = true)
/// <summary>
/// Encodes a dataSet field
/// </summary>
private void EncodeField(JsonEncoder encoder, Field field)
private void EncodeField(IJsonEncoder encoder, Field field)
{
string fieldName = field.FieldMetaData.Name;

Expand All @@ -477,16 +477,15 @@ private void EncodeField(JsonEncoder encoder, Field field)
// the field value is encoded as a Variant encoded using the reversible OPC UA JSON Data Encoding
// defined in OPC 10000-6.
encoder.ForceNamespaceUri = false;
encoder.WriteVariant(fieldName, valueToEncode, true);
encoder.UsingReversibleEncoding(encoder.WriteVariant, fieldName, valueToEncode, true);
break;

case FieldTypeEncodingMask.RawData:
// If the DataSetFieldContentMask results in a RawData representation,
// the field value is a Variant encoded using the non-reversible OPC UA JSON Data Encoding
// defined in OPC 10000-6
encoder.ForceNamespaceUri = true;

encoder.WriteVariant(fieldName, valueToEncode, false);
encoder.UsingReversibleEncoding(encoder.WriteVariant, fieldName, valueToEncode, false);
break;

case FieldTypeEncodingMask.DataValue:
Expand Down Expand Up @@ -522,7 +521,7 @@ private void EncodeField(JsonEncoder encoder, Field field)
// If the DataSetFieldContentMask results in a DataValue representation,
// the field value is a DataValue encoded using the non-reversible OPC UA JSON Data Encoding
encoder.ForceNamespaceUri = true;
encoder.WriteDataValue(fieldName, dataValue, false);
encoder.UsingReversibleEncoding(encoder.WriteDataValue, fieldName, dataValue, false);
break;
}
}
Expand All @@ -534,7 +533,7 @@ private void EncodeField(JsonEncoder encoder, Field field)
/// Decode RawData type
/// </summary>
/// <returns></returns>
private object DecodeRawData(JsonDecoder jsonDecoder, FieldMetaData fieldMetaData, string fieldName)
private object DecodeRawData(IJsonDecoder jsonDecoder, FieldMetaData fieldMetaData, string fieldName)
{
if (fieldMetaData.BuiltInType != 0)
{
Expand All @@ -546,7 +545,6 @@ private object DecodeRawData(JsonDecoder jsonDecoder, FieldMetaData fieldMetaDat
}
if (fieldMetaData.ValueRank >= ValueRanks.OneDimension)
{

return jsonDecoder.ReadArray(fieldName, fieldMetaData.ValueRank, (BuiltInType)fieldMetaData.BuiltInType);
}
else
Expand All @@ -566,7 +564,7 @@ private object DecodeRawData(JsonDecoder jsonDecoder, FieldMetaData fieldMetaDat
/// <summary>
/// Decodes the DataSetMessageHeader
/// </summary>
private void DecodeDataSetMessageHeader(JsonDecoder jsonDecoder)
private void DecodeDataSetMessageHeader(IJsonDecoder jsonDecoder)
{
object token = null;
if ((DataSetMessageContentMask & JsonDataSetMessageContentMask.DataSetWriterId) != 0)
Expand Down Expand Up @@ -613,7 +611,7 @@ private void DecodeDataSetMessageHeader(JsonDecoder jsonDecoder)
/// <summary>
/// Decode a scalar type
/// </summary>
private object DecodeRawScalar(JsonDecoder jsonDecoder, byte builtInType, string fieldName)
private object DecodeRawScalar(IJsonDecoder jsonDecoder, byte builtInType, string fieldName)
{
try
{
Expand Down
14 changes: 7 additions & 7 deletions Libraries/Opc.Ua.PubSub/Encoding/JsonNetworkMessage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ public override void Encode(IServiceMessageContext messageContext, Stream stream
{
bool topLevelIsArray = !HasNetworkMessageHeader && !HasSingleDataSetMessage && !IsMetaDataMessage;

using (JsonEncoder encoder = new JsonEncoder(messageContext, true, topLevelIsArray, stream))
using (var encoder = new JsonEncoder(messageContext, true, topLevelIsArray, stream))
{
if (IsMetaDataMessage)
{
Expand Down Expand Up @@ -285,7 +285,7 @@ public override void Decode(IServiceMessageContext context, byte[] message, ILis
/// <summary>
/// Encodes the object in a binary stream.
/// </summary>
private void Encode(JsonEncoder jsonEncoder)
private void Encode(IJsonEncoder jsonEncoder)
{
if (jsonEncoder == null)
{
Expand All @@ -303,7 +303,7 @@ private void Encode(JsonEncoder jsonEncoder)
/// <summary>
/// Encode Network Message Header
/// </summary>
private void EncodeNetworkMessageHeader(IEncoder jsonEncoder)
private void EncodeNetworkMessageHeader(IJsonEncoder jsonEncoder)
{
jsonEncoder.WriteString(nameof(MessageId), MessageId);
jsonEncoder.WriteString(nameof(MessageType), MessageType);
Expand Down Expand Up @@ -346,7 +346,7 @@ private void EncodeNetworkMessageHeader(IEncoder jsonEncoder)
/// <summary>
/// Encode DataSetMessages
/// </summary>
private void EncodeMessages(JsonEncoder encoder)
private void EncodeMessages(IJsonEncoder encoder)
{
if (DataSetMessages != null && DataSetMessages.Count > 0)
{
Expand Down Expand Up @@ -394,7 +394,7 @@ private void EncodeReplyTo(IEncoder jsonEncoder)
/// Encode Network Message Header
/// </summary>
/// <param name="jsonDecoder"></param>
private void DecodeNetworkMessageHeader(JsonDecoder jsonDecoder)
private void DecodeNetworkMessageHeader(IJsonDecoder jsonDecoder)
{
object token = null;
if (jsonDecoder.ReadField(nameof(MessageId), out token))
Expand Down Expand Up @@ -459,7 +459,7 @@ private void DecodeNetworkMessageHeader(JsonDecoder jsonDecoder)
/// Decode the jsonDecoder content as a MetaData message
/// </summary>
/// <param name="jsonDecoder"></param>
private void DecodeMetaDataMessage(JsonDecoder jsonDecoder)
private void DecodeMetaDataMessage(IJsonDecoder jsonDecoder)
{
try
{
Expand All @@ -478,7 +478,7 @@ private void DecodeMetaDataMessage(JsonDecoder jsonDecoder)
/// <param name="jsonDecoder"></param>
/// <param name="dataSetReaders"></param>
/// <returns></returns>
private void DecodeSubscribedDataSets(JsonDecoder jsonDecoder, IList<DataSetReaderDataType> dataSetReaders)
private void DecodeSubscribedDataSets(IJsonDecoder jsonDecoder, IList<DataSetReaderDataType> dataSetReaders)
{
if (dataSetReaders == null || dataSetReaders.Count == 0)
{
Expand Down

0 comments on commit 0bf2e93

Please sign in to comment.