Skip to content

Commit 0b26fea

Browse files
bitkeeperoroulet
authored andcommitted
[xmlimporter] support use of extension dictionaries
1 parent 7e6c7fe commit 0b26fea

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

opcua/common/xmlimporter.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def import_xml(self, xmlpath):
5353

5454
self.namespaces = self._map_namespaces(self.parser.get_used_namespaces())
5555
self.aliases = self._map_aliases(self.parser.get_aliases())
56-
56+
5757
dnodes = self.parser.get_node_datas()
5858
dnodes = self.make_objects(dnodes)
5959
nodes_parsed = self._sort_nodes_by_parentid(dnodes)
@@ -98,7 +98,7 @@ def _add_references(self, refs):
9898
return self.server.iserver.isession.add_references(refs)
9999
else:
100100
return self.server.uaclient.add_references(refs)
101-
101+
102102
def make_objects(self, node_datas):
103103
new_nodes = []
104104
for ndata in node_datas:
@@ -206,8 +206,21 @@ def add_variable(self, obj):
206206
res[0].StatusCode.check()
207207
return res[0].AddedNodeId
208208

209+
def _get_ext_class(self, name):
210+
if hasattr(ua, name):
211+
return getattr(ua, name)
212+
elif name in self.aliases.keys():
213+
nodeid = self.aliases[name]
214+
class_type = ua.uatypes.get_extensionobject_class_type(nodeid)
215+
if class_type:
216+
return class_type
217+
else:
218+
raise Exception("Error no extension class registered ", name, nodeid)
219+
else:
220+
raise Exception("Error no alias found for extension class", name)
221+
209222
def _make_ext_obj(self, obj):
210-
ext = getattr(ua, obj.objname)()
223+
ext = self._get_ext_class(obj.objname)()
211224
for name, val in obj.body:
212225
if isinstance(val, str):
213226
raise Exception("Error val should a dict", name, val)

opcua/ua/uatypes.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ def __init__(self, identifier=None, namespaceidx=0, nodeidtype=None):
283283
raise UaError("NodeId: Could not guess type of NodeId, set NodeIdType")
284284

285285
def _key(self):
286-
if self.NodeIdType in (NodeIdType.TwoByte, NodeIdType.FourByte, NodeIdType.Numeric):
286+
if self.NodeIdType in (NodeIdType.TwoByte, NodeIdType.FourByte, NodeIdType.Numeric):
287287
# twobyte, fourbyte and numeric may represent the same node
288288
return (NodeIdType.Numeric, self.NamespaceIndex, self.Identifier)
289289
return (self.NodeIdType, self.NamespaceIndex, self.Identifier)
@@ -1129,6 +1129,14 @@ def register_extension_object(name, nodeid, class_type):
11291129
extension_object_classes[nodeid] = class_type
11301130
extension_object_ids[name] = nodeid
11311131

1132+
def get_extensionobject_class_type(typeid):
1133+
"""
1134+
Returns the registered class type for typid of an extension object
1135+
"""
1136+
if typeid in extension_object_classes:
1137+
return extension_object_classes[typeid]
1138+
else:
1139+
return None
11321140

11331141
def extensionobject_from_binary(data):
11341142
"""

0 commit comments

Comments
 (0)