Skip to content

Commit 326ded2

Browse files
committed
Nested address spaces
1 parent 09e6498 commit 326ded2

10 files changed

+244
-186
lines changed

opcua/common/utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ def run_until_complete(self, coro):
210210
class ThreadSafeDict(MutableMapping):
211211

212212
def __init__(self, cache=None):
213-
self._lock = threading.RLock() # FIXME: should use multiple reader, one writter pattern
213+
self._lock = cache._lock if hasattr(cache, '_lock') else threading.RLock() # FIXME: should use multiple reader, one writter pattern
214214
if cache is None:
215215
self._cache = {}
216216
else:
@@ -245,7 +245,7 @@ def __delitem__(self, key):
245245

246246
def __iter__(self):
247247
with self._lock:
248-
return iter(self._cache.keys())
248+
return self._cache.__iter__()
249249

250250
def __len__(self):
251251
return len(self._cache)

opcua/server/address_space.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -311,10 +311,10 @@ def _delete_node(self, item, user):
311311
return ua.StatusCode(ua.StatusCodes.BadNodeIdUnknown)
312312

313313
if item.DeleteTargetReferences:
314-
for elem in self._aspace.keys():
315-
for rdesc in self._aspace[elem].references:
314+
for ndata in self._aspace.values():
315+
for rdesc in ndata.references:
316316
if rdesc.NodeId == item.NodeId:
317-
self._aspace[elem].references.remove(rdesc)
317+
ndata.references.remove(rdesc)
318318

319319
self._delete_node_callbacks(self._aspace[item.NodeId])
320320

@@ -479,23 +479,21 @@ class AddressSpace(ThreadSafeDict):
479479
and helper methods.
480480
The methods are thread safe
481481
"""
482+
DEFAULT_USER_NAMESPACE_INDEX = 2
482483

483484
def __init__(self, cache=None):
484485
super(AddressSpace, self).__init__(cache)
485486
self.logger = logging.getLogger(__name__)
486487
self._datachange_callback_counter = 200
487488
self._handle_to_attribute_map = {}
488-
self._default_idx = 2
489489
self._nodeid_counter = {0: 20000, 1: 2000}
490490

491-
def generate_nodeid(self, idx=None):
492-
if idx is None:
493-
idx = self._default_idx
491+
def generate_nodeid(self, idx=DEFAULT_USER_NAMESPACE_INDEX):
494492
if idx in self._nodeid_counter:
495493
self._nodeid_counter[idx] += 1
496494
else:
497495
# get the biggest identifier number from the existed nodes in address space
498-
identifier_list = sorted([nodeid.Identifier for nodeid in self.keys()
496+
identifier_list = sorted([nodeid.Identifier for nodeid in self
499497
if nodeid.NamespaceIndex == idx and nodeid.NodeIdType
500498
in (ua.NodeIdType.Numeric, ua.NodeIdType.TwoByte, ua.NodeIdType.FourByte)])
501499
if identifier_list:
@@ -505,15 +503,15 @@ def generate_nodeid(self, idx=None):
505503
nodeid = ua.NodeId(self._nodeid_counter[idx], idx)
506504
with self._lock: # OK since reentrant lock
507505
while True:
508-
if nodeid in self.keys():
506+
if nodeid in self:
509507
nodeid = self.generate_nodeid(idx)
510508
else:
511509
return nodeid
512510

513511
def get_attribute_value(self, nodeid, attr):
514512
with self._lock:
515513
self.logger.debug("get attr val: %s %s", nodeid, attr)
516-
if nodeid not in self.keys():
514+
if nodeid not in self:
517515
dv = ua.DataValue()
518516
dv.StatusCode = ua.StatusCode(ua.StatusCodes.BadNodeIdUnknown)
519517
return dv
@@ -530,10 +528,11 @@ def get_attribute_value(self, nodeid, attr):
530528
def set_attribute_value(self, nodeid, attr, value):
531529
with self._lock:
532530
self.logger.debug("set attr val: %s %s %s", nodeid, attr, value)
533-
node = self.get(nodeid, None)
534-
if node is None:
531+
532+
try:
533+
attval = self[nodeid].attributes.get(attr, None)
534+
except KeyError:
535535
return ua.StatusCode(ua.StatusCodes.BadNodeIdUnknown)
536-
attval = node.attributes.get(attr, None)
537536
if attval is None:
538537
return ua.StatusCode(ua.StatusCodes.BadAttributeIdInvalid)
539538

@@ -554,12 +553,13 @@ def set_attribute_value(self, nodeid, attr, value):
554553
def add_datachange_callback(self, nodeid, attr, callback):
555554
with self._lock:
556555
self.logger.debug("set attr callback: %s %s %s", nodeid, attr, callback)
557-
if nodeid not in self.keys():
556+
557+
try:
558+
attval = self[nodeid].attributes.get(attr, None)
559+
except KeyError:
558560
return ua.StatusCode(ua.StatusCodes.BadNodeIdUnknown), 0
559-
node = self[nodeid]
560-
if attr not in node.attributes:
561+
if attval is None:
561562
return ua.StatusCode(ua.StatusCodes.BadAttributeIdInvalid), 0
562-
attval = node.attributes[attr]
563563
self._datachange_callback_counter += 1
564564
handle = self._datachange_callback_counter
565565
attval.datachange_callbacks[handle] = callback

0 commit comments

Comments
 (0)