Search in sources :

Example 1 with ObjectTypeNode

use of org.eclipse.milo.opcua.sdk.core.nodes.ObjectTypeNode in project milo by eclipse.

the class NodeFactory method createNodeTree.

public Tree<UaNode> createNodeTree(NodeId rootNodeId, NodeId typeDefinitionId, InstantiationCallback instantiationCallback) throws UaException {
    AddressSpaceManager addressSpaceManager = context.getServer().getAddressSpaceManager();
    if (!addressSpaceManager.getManagedNode(typeDefinitionId).isPresent()) {
        throw new UaException(StatusCodes.Bad_NodeIdUnknown, "unknown type definition: " + typeDefinitionId);
    }
    NamespaceTable namespaceTable = context.getServer().getNamespaceTable();
    InstanceDeclarationHierarchy idh;
    try {
        idh = IDH_CACHE.get(typeDefinitionId, () -> {
            LoggerFactory.getLogger(NodeFactory.class).debug("InstanceDeclarationHierarchy cache " + "miss for typeDefinitionId={}", typeDefinitionId);
            return InstanceDeclarationHierarchy.create(addressSpaceManager, namespaceTable, typeDefinitionId);
        });
    } catch (ExecutionException e) {
        throw new UaException(StatusCodes.Bad_InternalError, e);
    }
    NodeTable nodeTable = idh.getNodeTable();
    ReferenceTable referenceTable = idh.getReferenceTable();
    Map<BrowsePath, UaNode> nodes = new HashMap<>();
    for (Map.Entry<BrowsePath, NodeId> entry : nodeTable.nodes.entrySet()) {
        BrowsePath browsePath = entry.getKey();
        NodeId nodeId = entry.getValue();
        UaNode node = addressSpaceManager.getManagedNode(nodeId).orElse(null);
        if (browsePath.parent == null) {
            if (node instanceof UaObjectTypeNode) {
                UaNode instance = instanceFromTypeDefinition(rootNodeId, (UaObjectTypeNode) node);
                nodes.put(browsePath, instance);
            } else if (node instanceof UaVariableTypeNode) {
                UaNode instance = instanceFromTypeDefinition(rootNodeId, (UaVariableTypeNode) node);
                nodes.put(browsePath, instance);
            } else {
                throw new UaException(StatusCodes.Bad_InternalError);
            }
        } else {
            // Non-root Nodes are all instance declarations
            NodeId instanceNodeId = instanceNodeId(rootNodeId, browsePath);
            if (node instanceof UaMethodNode) {
                UaMethodNode declaration = (UaMethodNode) node;
                UaMethodNode instance = new UaMethodNode(context, instanceNodeId, declaration.getBrowseName(), declaration.getDisplayName(), declaration.getDescription(), declaration.getWriteMask(), declaration.getUserWriteMask(), declaration.isExecutable(), declaration.isUserExecutable());
                nodes.put(browsePath, instance);
            } else if (node instanceof UaObjectNode) {
                UaObjectNode declaration = (UaObjectNode) node;
                ExpandedNodeId instanceTypeDefinitionId = getTypeDefinition(referenceTable, browsePath);
                UaNode typeDefinitionNode = addressSpaceManager.getManagedNode(instanceTypeDefinitionId).orElse(null);
                if (typeDefinitionNode instanceof ObjectTypeNode) {
                    boolean optional = isOptionalDeclaration(declaration);
                    if (!optional || instantiationCallback.includeOptionalNode(typeDefinitionNode.getNodeId(), declaration.getBrowseName())) {
                        UaObjectNode instance = instanceFromTypeDefinition(instanceNodeId, (ObjectTypeNode) typeDefinitionNode);
                        instance.setBrowseName(declaration.getBrowseName());
                        instance.setDisplayName(declaration.getDisplayName());
                        instance.setDescription(declaration.getDescription());
                        instance.setWriteMask(declaration.getWriteMask());
                        instance.setUserWriteMask(declaration.getUserWriteMask());
                        instance.setEventNotifier(declaration.getEventNotifier());
                        nodes.put(browsePath, instance);
                    }
                } else {
                    throw new UaException(StatusCodes.Bad_InternalError, "expected type definition for " + instanceTypeDefinitionId);
                }
            } else if (node instanceof UaVariableNode) {
                UaVariableNode declaration = (UaVariableNode) node;
                ExpandedNodeId instanceTypeDefinitionId = getTypeDefinition(referenceTable, browsePath);
                UaNode typeDefinitionNode = addressSpaceManager.getManagedNode(instanceTypeDefinitionId).orElse(null);
                if (typeDefinitionNode instanceof VariableTypeNode) {
                    boolean optional = isOptionalDeclaration(declaration);
                    if (!optional || instantiationCallback.includeOptionalNode(typeDefinitionNode.getNodeId(), declaration.getBrowseName())) {
                        UaVariableNode instance = instanceFromTypeDefinition(instanceNodeId, (VariableTypeNode) typeDefinitionNode);
                        instance.setBrowseName(declaration.getBrowseName());
                        instance.setDisplayName(declaration.getDisplayName());
                        instance.setDescription(declaration.getDescription());
                        instance.setWriteMask(declaration.getWriteMask());
                        instance.setUserWriteMask(declaration.getUserWriteMask());
                        instance.setValue(declaration.getValue());
                        instance.setDataType(declaration.getDataType());
                        instance.setValueRank(declaration.getValueRank());
                        instance.setArrayDimensions(declaration.getArrayDimensions());
                        instance.setAccessLevel(declaration.getAccessLevel());
                        instance.setUserAccessLevel(declaration.getUserAccessLevel());
                        nodes.put(browsePath, instance);
                    }
                } else {
                    throw new UaException(StatusCodes.Bad_InternalError, "expected type definition for " + instanceTypeDefinitionId);
                }
            } else {
                throw new UaException(StatusCodes.Bad_InternalError, "not an instance declaration: " + node);
            }
        }
    }
    nodes.forEach((browsePath, node) -> {
        List<ReferenceTable.RefRow> references = referenceTable.getReferences(browsePath);
        references.forEach(t -> {
            NodeId referenceTypeId = t.nodeId;
            ReferenceTable.RefTarget target = t.target;
            if (!Identifiers.HasModellingRule.equals(referenceTypeId)) {
                if (target.targetNodeId != null) {
                    node.addReference(new Reference(node.getNodeId(), referenceTypeId, target.targetNodeId, true));
                } else {
                    BrowsePath targetPath = target.targetPath;
                    UaNode targetNode = nodes.get(targetPath);
                    if (targetNode != null) {
                        node.addReference(new Reference(node.getNodeId(), referenceTypeId, targetNode.getNodeId().expanded(), true));
                    }
                }
            }
        });
        context.getNodeManager().addNode(node);
    });
    Tree<UaNode> nodeTree = nodeTable.getBrowsePathTree().map(nodes::get);
    notifyInstantiationCallback(nodeTree, instantiationCallback);
    return nodeTree;
}
Also used : HashMap(java.util.HashMap) UaException(org.eclipse.milo.opcua.stack.core.UaException) UaObjectTypeNode(org.eclipse.milo.opcua.sdk.server.nodes.UaObjectTypeNode) ObjectTypeNode(org.eclipse.milo.opcua.sdk.core.nodes.ObjectTypeNode) UaNode(org.eclipse.milo.opcua.sdk.server.nodes.UaNode) UaMethodNode(org.eclipse.milo.opcua.sdk.server.nodes.UaMethodNode) NamespaceTable(org.eclipse.milo.opcua.stack.core.NamespaceTable) UaVariableTypeNode(org.eclipse.milo.opcua.sdk.server.nodes.UaVariableTypeNode) AddressSpaceManager(org.eclipse.milo.opcua.sdk.server.api.AddressSpaceManager) ExecutionException(java.util.concurrent.ExecutionException) UaVariableTypeNode(org.eclipse.milo.opcua.sdk.server.nodes.UaVariableTypeNode) VariableTypeNode(org.eclipse.milo.opcua.sdk.core.nodes.VariableTypeNode) UaObjectTypeNode(org.eclipse.milo.opcua.sdk.server.nodes.UaObjectTypeNode) UaObjectNode(org.eclipse.milo.opcua.sdk.server.nodes.UaObjectNode) Reference(org.eclipse.milo.opcua.sdk.core.Reference) ExpandedNodeId(org.eclipse.milo.opcua.stack.core.types.builtin.ExpandedNodeId) UaVariableNode(org.eclipse.milo.opcua.sdk.server.nodes.UaVariableNode) NodeId(org.eclipse.milo.opcua.stack.core.types.builtin.NodeId) ExpandedNodeId(org.eclipse.milo.opcua.stack.core.types.builtin.ExpandedNodeId) HashMap(java.util.HashMap) Map(java.util.Map)

Example 2 with ObjectTypeNode

use of org.eclipse.milo.opcua.sdk.core.nodes.ObjectTypeNode in project milo by eclipse.

the class NodeFactory method notifyInstantiationCallback.

protected void notifyInstantiationCallback(Tree<UaNode> nodeTree, InstantiationCallback instantiationCallback) {
    nodeTree.traverseWithParent((node, parentNode) -> {
        if (parentNode instanceof UaObjectNode && node instanceof UaMethodNode) {
            UaMethodNode methodNode = (UaMethodNode) node;
            instantiationCallback.onMethodAdded((UaObjectNode) parentNode, methodNode);
        } else if (node instanceof UaObjectNode) {
            UaObjectNode objectNode = (UaObjectNode) node;
            ObjectTypeNode objectTypeNode = objectNode.getTypeDefinitionNode();
            instantiationCallback.onObjectAdded(parentNode, objectNode, objectTypeNode.getNodeId());
        } else if (node instanceof UaVariableNode) {
            UaVariableNode variableNode = (UaVariableNode) node;
            VariableTypeNode variableTypeNode = variableNode.getTypeDefinitionNode();
            instantiationCallback.onVariableAdded(parentNode, variableNode, variableTypeNode.getNodeId());
        }
    });
}
Also used : UaVariableNode(org.eclipse.milo.opcua.sdk.server.nodes.UaVariableNode) UaObjectNode(org.eclipse.milo.opcua.sdk.server.nodes.UaObjectNode) UaMethodNode(org.eclipse.milo.opcua.sdk.server.nodes.UaMethodNode) UaObjectTypeNode(org.eclipse.milo.opcua.sdk.server.nodes.UaObjectTypeNode) ObjectTypeNode(org.eclipse.milo.opcua.sdk.core.nodes.ObjectTypeNode) UaVariableTypeNode(org.eclipse.milo.opcua.sdk.server.nodes.UaVariableTypeNode) VariableTypeNode(org.eclipse.milo.opcua.sdk.core.nodes.VariableTypeNode)

Aggregations

ObjectTypeNode (org.eclipse.milo.opcua.sdk.core.nodes.ObjectTypeNode)2 VariableTypeNode (org.eclipse.milo.opcua.sdk.core.nodes.VariableTypeNode)2 UaMethodNode (org.eclipse.milo.opcua.sdk.server.nodes.UaMethodNode)2 UaObjectNode (org.eclipse.milo.opcua.sdk.server.nodes.UaObjectNode)2 UaObjectTypeNode (org.eclipse.milo.opcua.sdk.server.nodes.UaObjectTypeNode)2 UaVariableNode (org.eclipse.milo.opcua.sdk.server.nodes.UaVariableNode)2 UaVariableTypeNode (org.eclipse.milo.opcua.sdk.server.nodes.UaVariableTypeNode)2 HashMap (java.util.HashMap)1 Map (java.util.Map)1 ExecutionException (java.util.concurrent.ExecutionException)1 Reference (org.eclipse.milo.opcua.sdk.core.Reference)1 AddressSpaceManager (org.eclipse.milo.opcua.sdk.server.api.AddressSpaceManager)1 UaNode (org.eclipse.milo.opcua.sdk.server.nodes.UaNode)1 NamespaceTable (org.eclipse.milo.opcua.stack.core.NamespaceTable)1 UaException (org.eclipse.milo.opcua.stack.core.UaException)1 ExpandedNodeId (org.eclipse.milo.opcua.stack.core.types.builtin.ExpandedNodeId)1 NodeId (org.eclipse.milo.opcua.stack.core.types.builtin.NodeId)1