Skip to content

Commit

Permalink
improve extension object initialize field
Browse files Browse the repository at this point in the history
  • Loading branch information
erossignon committed Aug 10, 2022
1 parent 6327868 commit 7edf48c
Show file tree
Hide file tree
Showing 12 changed files with 147 additions and 138 deletions.
18 changes: 9 additions & 9 deletions modeling/model_with_custom_datatype.xml
Original file line number Diff line number Diff line change
Expand Up @@ -70,38 +70,38 @@
<Reference ReferenceType="HasSubtype" IsForward="false">i=12</Reference>
</References>
</UADataType>
<UADataType NodeId="ns=1;i=3003" BrowseName="1:MyStruct">
<DisplayName>MyStruct</DisplayName>
<UADataType NodeId="ns=1;i=3003" BrowseName="1:MyStructDataType">
<DisplayName>MyStructDataType</DisplayName>
<References>
<Reference ReferenceType="HasEncoding">ns=1;i=5001</Reference>
<Reference ReferenceType="HasEncoding">ns=1;i=5003</Reference>
<Reference ReferenceType="HasEncoding">ns=1;i=5002</Reference>
<Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
</References>
<Definition Name="1:MyStruct">
<Definition Name="1:MyStructDataType">
<Field DataType="MyIdentifierString" Name="Id"/>
</Definition>
</UADataType>
<UAVariable DataType="String" ParentNodeId="ns=1;i=6001" NodeId="ns=1;i=6005" BrowseName="1:MyStruct">
<DisplayName>MyStruct</DisplayName>
<UAVariable DataType="String" ParentNodeId="ns=1;i=6001" NodeId="ns=1;i=6005" BrowseName="1:MyStructDataType">
<DisplayName>MyStructDataType</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=69</Reference>
<Reference ReferenceType="HasDescription" IsForward="false">ns=1;i=5001</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=6001</Reference>
</References>
<Value>
<uax:String>MyStruct</uax:String>
<uax:String>MyStructDataType</uax:String>
</Value>
</UAVariable>
<UAVariable DataType="String" ParentNodeId="ns=1;i=6003" NodeId="ns=1;i=6006" BrowseName="1:MyStruct">
<DisplayName>MyStruct</DisplayName>
<UAVariable DataType="String" ParentNodeId="ns=1;i=6003" NodeId="ns=1;i=6006" BrowseName="1:MyStructDataType">
<DisplayName>MyStructDataType</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=69</Reference>
<Reference ReferenceType="HasDescription" IsForward="false">ns=1;i=5002</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=6003</Reference>
</References>
<Value>
<uax:String>//xs:element[@name='MyStruct']</uax:String>
<uax:String>//xs:element[@name='MyStructDataType']</uax:String>
</Value>
</UAVariable>
<UAVariable SymbolicName="TypeDictionary_BinarySchema" DataType="ByteString" NodeId="ns=1;i=6001" BrowseName="1:TypeDictionary">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -294,8 +294,8 @@ function _dumpVariantInnerValueEnum(xw: XmlWriter, definition: EnumDefinition, v
if (!definition.fields) {
return;
}
const field = definition.fields.find((f) => f.value[1] === value);
xw.text(`${field?.name}_${value}`);
const field = definition.fields.find((f) => f.value[1] === value || f.name === value);
xw.text(`${field?.name}_${field?.value[1]}`);
}

// eslint-disable-next-line complexity
Expand Down Expand Up @@ -329,7 +329,6 @@ function _dumpVariantInnerValue(
case DataType.Boolean:
case DataType.SByte:
case DataType.Byte:
case DataType.SByte:
case DataType.Float:
case DataType.Double:
case DataType.Int16:
Expand Down Expand Up @@ -779,6 +778,16 @@ function _dumpStructureDefinition(
xw.endElement();
}
}

function _dumpEncodings(xw: XmlWriter, uaDataType: UADataType) {
const encodings = uaDataType.findReferencesExAsObject("HasEncoding", BrowseDirection.Forward);
for (const encoding of encodings) {
if (encoding.nodeClass !== NodeClass.Object) {
continue;
}
_dumpUAObject(xw, encoding as UAObject);
}
}
function _dumpUADataTypeDefinition(xw: XmlWriter, uaDataType: UADataType) {
const uaDataTypeBase = uaDataType.subtypeOfObj;

Expand Down Expand Up @@ -824,6 +833,8 @@ function dumpUADataType(xw: XmlWriter, node: UADataType) {

xw.endElement();

_dumpEncodings(xw, node);

dumpAggregates(xw, node);
}

Expand Down Expand Up @@ -927,7 +938,10 @@ function dumpUAVariableType(xw: XmlWriter, node: UAVariableType) {

function dumpUAObject(xw: XmlWriter, node: UAObject) {
xw.writeComment("Object - " + b(xw, node.browseName) + " {{{{ ");

_dumpUAObject(xw, node);
xw.writeComment("Object - " + b(xw, node.browseName) + " }}}} ");
}
function _dumpUAObject(xw: XmlWriter, node: UAObject) {
xw.visitedNode = xw.visitedNode || {};
assert(!xw.visitedNode[_hash(node)]);
xw.visitedNode[_hash(node)] = 1;
Expand All @@ -945,8 +959,6 @@ function dumpUAObject(xw: XmlWriter, node: UAObject) {
dumpAggregates(xw, node);

dumpElementInFolder(xw, node as UAObjectImpl);

xw.writeComment("Object - " + b(xw, node.browseName) + " }}}} ");
}
function dumpElementInFolder(xw: XmlWriter, node: BaseNodeImpl) {
const aggregates = node
Expand Down
14 changes: 3 additions & 11 deletions packages/node-opcua-address-space/src/ua_variable_impl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,8 @@ import {
defaultCloneFilter,
GetFunc,
SetFunc,
VariableDataValueGetterCallback,
VariableDataValueGetterPromise,
VariableDataValueGetterSync,
VariableDataValueSetterWithCallback,
VariableDataValueSetterWithPromise
} from "node-opcua-address-space-base";
VariableDataValueSetterWithCallback} from "node-opcua-address-space-base";
import { assert } from "node-opcua-assert";
import {
isValidDataEncoding,
Expand Down Expand Up @@ -49,12 +45,9 @@ import {
ReadEventDetails,
ReadProcessedDetails,
ReadRawModifiedDetails,
StructureDefinition,
StructureField,
WriteValueOptions
} from "node-opcua-types";
import * as utils from "node-opcua-utils";
import { lowerFirstLetter } from "node-opcua-utils";
import {
Variant,
VariantLike,
Expand All @@ -68,7 +61,6 @@ import { StatusCodeCallback } from "node-opcua-status-code";
import {
IAddressSpace,
BindVariableOptions,
ContinuationPoint,
IVariableHistorian,
TimestampGetFunc,
TimestampSetFunc,
Expand All @@ -81,12 +73,12 @@ import {
BaseNode,
UAVariableT
} from "node-opcua-address-space-base";
import { EnumFilterOperator, UAHistoricalDataConfiguration } from "node-opcua-nodeset-ua";
import { UAHistoricalDataConfiguration } from "node-opcua-nodeset-ua";

import { SessionContext } from "../source/session_context";
import { convertToCallbackFunction1 } from "../source/helpers/multiform_func";
import { BaseNodeImpl, InternalBaseNodeOptions } from "./base_node_impl";
import { _clone, ToStringBuilder, UAVariable_toString, valueRankToString } from "./base_node_private";
import { _clone, ToStringBuilder, UAVariable_toString } from "./base_node_private";
import { EnumerationInfo, IEnumItem, UADataTypeImpl } from "./ua_data_type_impl";
import { apply_condition_refresh, ConditionRefreshCache } from "./apply_condition_refresh";
import {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -746,7 +746,7 @@ describe("@A@ Testing loading nodeset with custom basic types", function (this:
const myIdentifierDataType = addressSpace.findDataType("MyIdentifierString", ns)!;
should.exists(myIdentifierDataType);

const myStructDataTypeNode = addressSpace.findDataType("MyStruct", ns)!;
const myStructDataTypeNode = addressSpace.findDataType("MyStructDataType", ns)!;
should.exists(myStructDataTypeNode);

const struct = addressSpace.constructExtensionObject(myStructDataTypeNode, {
Expand Down
118 changes: 54 additions & 64 deletions packages/node-opcua-address-space/test/test_loadnodeset_value.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ describe("Testing loading nodeset with extension objects values in types", () =>
otherConnectionsValue[0].constructor.name.should.eql("ConnectionDetails");
otherConnectionsValue[1].constructor.name.should.eql("ConnectionDetails");

const c1 = addressSpace.constructExtensionObject(connectionDetailDataType, {
const c1 = addressSpace.constructExtensionObject(connectionDetailDataType!, {
certificates: Buffer.from("Hello World"),
url: "http://10.0.19.120"
});
Expand All @@ -103,7 +103,7 @@ describe("Testing loading nodeset with extension objects values in types", () =>
await generateAddressSpace(addressSpace, [nodesets.standard, xml_file1]);
const namespace = addressSpace.getNamespace("http://sterfive.com/Small_model/");
const xml = namespace.toNodeset2XML();
// xx console.log(xml);
// console.log(xml);

// prettier-ignore
x(xml).should.eql(x(`<?xml version="1.0"?>
Expand All @@ -119,7 +119,7 @@ describe("Testing loading nodeset with extension objects values in types", () =>
<Aliases>
<Alias Alias="1:ConnectionDetails">ns=1;i=47</Alias>
<Alias Alias="1:FlowDirection">ns=1;i=49</Alias>
<Alias Alias="1:MyStruct">ns=1;i=3003</Alias>
<Alias Alias="1:MyStructDataType">ns=1;i=3003</Alias>
<Alias Alias="ByteString">i=15</Alias>
<Alias Alias="EnumValueType">i=7594</Alias>
<Alias Alias="HasComponent">i=47</Alias>
Expand All @@ -133,8 +133,8 @@ describe("Testing loading nodeset with extension objects values in types", () =>
<Alias Alias="Organizes">i=35</Alias>
<Alias Alias="String">i=12</Alias>
</Aliases>
<!--ReferenceTypes-->
<!--DataTypes-->
<!--ReferenceTypes-->
<!--DataTypes-->
<UADataType NodeId="ns=1;i=3002" BrowseName="1:MyEnum">
<DisplayName>MyEnum</DisplayName>
<References>
Expand Down Expand Up @@ -206,19 +206,39 @@ describe("Testing loading nodeset with extension objects values in types", () =>
</ListOfExtensionObject>
</Value>
</UAVariable>
<UADataType NodeId="ns=1;i=3003" BrowseName="1:MyStruct">
<DisplayName>MyStruct</DisplayName>
<UADataType NodeId="ns=1;i=3003" BrowseName="1:MyStructDataType">
<DisplayName>MyStructDataType</DisplayName>
<References>
<Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
<Reference ReferenceType="HasEncoding">ns=1;i=5001</Reference>
<Reference ReferenceType="HasEncoding">ns=1;i=5002</Reference>
<Reference ReferenceType="HasEncoding">ns=1;i=5003</Reference>
</References>
<Definition Name="1:MyStruct">
<Definition Name="1:MyStructDataType">
<Field Name="F1" DataType="ns=1;i=3002"/>
<Field Name="F2" ArrayDimensions="0" ValueRank="1" DataType="ns=1;i=3002"/>
</Definition>
</UADataType>
<UAObject NodeId="ns=1;i=5001" BrowseName="Default Binary" SymbolicName="DefaultBinary">
<DisplayName>Default Binary</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
<Reference ReferenceType="HasDescription">ns=1;i=6006</Reference>
</References>
</UAObject>
<UAObject NodeId="ns=1;i=5003" BrowseName="Default JSON" SymbolicName="DefaultJson">
<DisplayName>Default JSON</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
</References>
</UAObject>
<UAObject NodeId="ns=1;i=5002" BrowseName="Default XML" SymbolicName="DefaultXml">
<DisplayName>Default XML</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
<Reference ReferenceType="HasDescription">ns=1;i=6007</Reference>
</References>
</UAObject>
<UADataType NodeId="ns=1;i=47" BrowseName="1:ConnectionDetails">
<DisplayName>ConnectionDetails</DisplayName>
<References>
Expand All @@ -232,6 +252,19 @@ describe("Testing loading nodeset with extension objects values in types", () =>
<Field Name="Url" DataType="i=12"/>
</Definition>
</UADataType>
<UAObject NodeId="ns=1;i=183" BrowseName="Default JSON" SymbolicName="DefaultJson">
<DisplayName>Default JSON</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
</References>
</UAObject>
<UAObject NodeId="ns=1;i=182" BrowseName="Default XML" SymbolicName="DefaultXml">
<DisplayName>Default XML</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
<Reference ReferenceType="HasDescription">ns=1;i=1196</Reference>
</References>
</UAObject>
<UADataType NodeId="ns=1;i=49" BrowseName="1:FlowDirection">
<DisplayName>FlowDirection</DisplayName>
<References>
Expand Down Expand Up @@ -260,16 +293,16 @@ describe("Testing loading nodeset with extension objects values in types", () =>
</ListOfLocalizedText>
</Value>
</UAVariable>
<!--ObjectTypes-->
<!--ObjectType - 1:Meter {{{{ -->
<!--ObjectTypes-->
<!--ObjectType - 1:Meter {{{{ -->
<UAObjectType NodeId="ns=1;i=39" BrowseName="1:Meter">
<DisplayName>Meter</DisplayName>
<References>
<Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
</References>
</UAObjectType>
<!--ObjectType - 1:Meter }}}}-->
<!--ObjectType - 1:LinearMeter {{{{ -->
<!--ObjectType - 1:Meter }}}}-->
<!--ObjectType - 1:LinearMeter {{{{ -->
<UAObjectType NodeId="ns=1;i=40" BrowseName="1:LinearMeter">
<DisplayName>LinearMeter</DisplayName>
<References>
Expand All @@ -286,8 +319,8 @@ describe("Testing loading nodeset with extension objects values in types", () =>
<Reference ReferenceType="HasTypeDefinition">ns=1;i=44</Reference>
</References>
</UAVariable>
<!--ObjectType - 1:LinearMeter }}}}-->
<!--VariableTypes-->
<!--ObjectType - 1:LinearMeter }}}}-->
<!--VariableTypes-->
<UAVariableType NodeId="ns=1;i=42" BrowseName="1:ConnectionDetailsType" DataType="1:ConnectionDetails">
<DisplayName>ConnectionDetailsType</DisplayName>
<References>
Expand Down Expand Up @@ -326,7 +359,7 @@ describe("Testing loading nodeset with extension objects values in types", () =>
<Reference ReferenceType="HasModellingRule">i=80</Reference>
</References>
</UAVariable>
<!--Other Nodes-->
<!--Other Nodes-->
<UAVariable NodeId="ns=1;i=1195" BrowseName="1:ConnectionDetails" DataType="String">
<DisplayName>ConnectionDetails</DisplayName>
<References>
Expand All @@ -336,59 +369,16 @@ describe("Testing loading nodeset with extension objects values in types", () =>
<String>ConnectionDetails</String>
</Value>
</UAVariable>
<!--Object - Default XML {{{{ -->
<UAObject NodeId="ns=1;i=182" BrowseName="Default XML" SymbolicName="DefaultXml">
<DisplayName>Default XML</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
<Reference ReferenceType="HasDescription">ns=1;i=1196</Reference>
</References>
</UAObject>
<!--Object - Default XML }}}} -->
<!--Object - Default JSON {{{{ -->
<UAObject NodeId="ns=1;i=183" BrowseName="Default JSON" SymbolicName="DefaultJson">
<DisplayName>Default JSON</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
</References>
</UAObject>
<!--Object - Default JSON }}}} -->
<!--Object - Default Binary {{{{ -->
<UAObject NodeId="ns=1;i=5001" BrowseName="Default Binary" SymbolicName="DefaultBinary">
<DisplayName>Default Binary</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
<Reference ReferenceType="HasDescription">ns=1;i=6006</Reference>
</References>
</UAObject>
<!--Object - Default Binary }}}} -->
<!--Object - Default XML {{{{ -->
<UAObject NodeId="ns=1;i=5002" BrowseName="Default XML" SymbolicName="DefaultXml">
<DisplayName>Default XML</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
<Reference ReferenceType="HasDescription">ns=1;i=6007</Reference>
</References>
</UAObject>
<!--Object - Default XML }}}} -->
<!--Object - Default JSON {{{{ -->
<UAObject NodeId="ns=1;i=5003" BrowseName="Default JSON" SymbolicName="DefaultJson">
<DisplayName>Default JSON</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
</References>
</UAObject>
<!--Object - Default JSON }}}} -->
<UAVariable NodeId="ns=1;i=6006" BrowseName="1:MyStruct" DataType="String">
<DisplayName>MyStruct</DisplayName>
<UAVariable NodeId="ns=1;i=6006" BrowseName="1:MyStructType" DataType="String">
<DisplayName>MyStructType</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=69</Reference>
</References>
<Value>
<String>MyStruct</String>
<String>MyStructDataType</String>
</Value>
</UAVariable>
<UAVariable NodeId="ns=1;i=6009" BrowseName="1:TestVar" AccessLevel="3" DataType="1:MyStruct">
<UAVariable NodeId="ns=1;i=6009" BrowseName="1:TestVar" AccessLevel="3" DataType="1:MyStructDataType">
<DisplayName>TestVar</DisplayName>
<References>
<Reference ReferenceType="Organizes" IsForward="false">i=2253</Reference>
Expand All @@ -400,14 +390,14 @@ describe("Testing loading nodeset with extension objects values in types", () =>
<Identifier>ns=1;i=5002</Identifier>
</TypeId>
<Body>
<MyStruct>
<MyStructDataType>
<F1>Orange_200</F1>
<F2>
<MyEnum>Green_100</MyEnum>
<MyEnum>Orange_200</MyEnum>
<MyEnum>Blue_300</MyEnum>
</F2>
</MyStruct>
</MyStructDataType>
</Body>
</ExtensionObject>
</Value>
Expand Down
Loading

0 comments on commit 7edf48c

Please sign in to comment.