-
Notifications
You must be signed in to change notification settings - Fork 14
/
reference_type_node.go
138 lines (120 loc) · 4.11 KB
/
reference_type_node.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package server
import (
"context"
"sync"
"github.com/awcullen/opcua"
)
// ReferenceTypeNode ...
type ReferenceTypeNode struct {
sync.RWMutex
nodeID opcua.NodeID
nodeClass opcua.NodeClass
browseName opcua.QualifiedName
displayName opcua.LocalizedText
description opcua.LocalizedText
rolePermissions []opcua.RolePermissionType
accessRestrictions uint16
references []opcua.Reference
isAbstract bool
symmetric bool
inverseName opcua.LocalizedText
}
var _ Node = (*ReferenceTypeNode)(nil)
// NewReferenceTypeNode ...
func NewReferenceTypeNode(nodeID opcua.NodeID, browseName opcua.QualifiedName, displayName opcua.LocalizedText, description opcua.LocalizedText, rolePermissions []opcua.RolePermissionType, references []opcua.Reference, isAbstract bool, symmetric bool, inverseName opcua.LocalizedText) *ReferenceTypeNode {
return &ReferenceTypeNode{
nodeID: nodeID,
nodeClass: opcua.NodeClassReferenceType,
browseName: browseName,
displayName: displayName,
description: description,
rolePermissions: rolePermissions,
accessRestrictions: 0,
references: references,
isAbstract: isAbstract,
symmetric: symmetric,
inverseName: inverseName,
}
}
// NodeID returns the NodeID attribute of this node.
func (n *ReferenceTypeNode) NodeID() opcua.NodeID {
return n.nodeID
}
// NodeClass returns the NodeClass attribute of this node.
func (n *ReferenceTypeNode) NodeClass() opcua.NodeClass {
return n.nodeClass
}
// BrowseName returns the BrowseName attribute of this node.
func (n *ReferenceTypeNode) BrowseName() opcua.QualifiedName {
return n.browseName
}
// DisplayName returns the DisplayName attribute of this node.
func (n *ReferenceTypeNode) DisplayName() opcua.LocalizedText {
return n.displayName
}
// Description returns the Description attribute of this node.
func (n *ReferenceTypeNode) Description() opcua.LocalizedText {
return n.description
}
// RolePermissions returns the RolePermissions attribute of this node.
func (n *ReferenceTypeNode) RolePermissions() []opcua.RolePermissionType {
return n.rolePermissions
}
// UserRolePermissions returns the RolePermissions attribute of this node for the current user.
func (n *ReferenceTypeNode) UserRolePermissions(ctx context.Context) []opcua.RolePermissionType {
filteredPermissions := []opcua.RolePermissionType{}
session, ok := ctx.Value(SessionKey).(*Session)
if !ok {
return filteredPermissions
}
roles := session.UserRoles()
rolePermissions := n.RolePermissions()
if rolePermissions == nil {
rolePermissions = session.Server().RolePermissions()
}
for _, role := range roles {
for _, rp := range rolePermissions {
if rp.RoleID == role {
filteredPermissions = append(filteredPermissions, rp)
}
}
}
return filteredPermissions
}
// References returns the References of this node.
func (n *ReferenceTypeNode) References() []opcua.Reference {
n.RLock()
res := n.references
n.RUnlock()
return res
}
// SetReferences sets the References of the Variable.
func (n *ReferenceTypeNode) SetReferences(value []opcua.Reference) {
n.Lock()
n.references = value
n.Unlock()
}
// IsAbstract returns the IsAbstract attribute of this node.
func (n *ReferenceTypeNode) IsAbstract() bool {
return n.isAbstract
}
// Symmetric returns the Symmetric attribute of this node.
func (n *ReferenceTypeNode) Symmetric() bool {
return n.symmetric
}
// InverseName returns the InverseName attribute of this node.
func (n *ReferenceTypeNode) InverseName() opcua.LocalizedText {
return n.inverseName
}
// IsAttributeIDValid returns true if attributeId is supported for the node.
func (n *ReferenceTypeNode) IsAttributeIDValid(attributeID uint32) bool {
switch attributeID {
case opcua.AttributeIDNodeID, opcua.AttributeIDNodeClass, opcua.AttributeIDBrowseName,
opcua.AttributeIDDisplayName, opcua.AttributeIDDescription, opcua.AttributeIDRolePermissions,
opcua.AttributeIDUserRolePermissions, opcua.AttributeIDIsAbstract, opcua.AttributeIDSymmetric,
opcua.AttributeIDInverseName:
return true
default:
return false
}
}