@Override public CompletableFuture<List<Node>> browse(NodeId nodeId) { UInteger nodeClassMask = uint( NodeClass.Method.getValue() | NodeClass.Object.getValue() | NodeClass.Variable.getValue()); UInteger resultMask = uint(BrowseResultMask.All.getValue()); CompletableFuture<BrowseResult> future = client.browse(new BrowseDescription( nodeId, BrowseDirection.Forward, Identifiers.HierarchicalReferences, true, nodeClassMask, resultMask )); return future.thenApply( result -> { List<ReferenceDescription> references = l(result.getReferences()); return references.stream() .flatMap(r -> opt2stream( r.getNodeId().local().map( id -> createNode(id, r.getNodeClass())))) .collect(toList()); } ); }
public CompletableFuture<List<DataTypeDictionary<?>>> readDataTypeDictionaries() { CompletableFuture<BrowseResult> browseFuture = browseNode(new BrowseDescription( Identifiers.OPCBinarySchema_TypeSystem, BrowseDirection.Forward, Identifiers.HasComponent, false, uint(NodeClass.Variable.getValue()), uint(BrowseResultMask.All.getValue()) )); CompletableFuture<Stream<NodeId>> dictionaryNodeIds = browseFuture.thenApply( browseResult -> toList(browseResult.getReferences()).stream() .filter(r -> r.getNodeId().getNamespaceIndex().intValue() != 0) .filter(r -> r.getTypeDefinition().equals(Identifiers.DataTypeDictionaryType.expanded())) .flatMap(r -> opt2stream(r.getNodeId().local())) ); return dictionaryNodeIds .thenApply(nodeIds -> nodeIds .map(this::readDataTypeDictionary) .collect(Collectors.toList())) .thenCompose(FutureUtils::sequence) .thenApply(list -> list.stream() .filter(Objects::nonNull) .collect(Collectors.toList())); }
public CompletableFuture<? extends Node> getComponent(QualifiedName browseName) { UInteger nodeClassMask = uint(NodeClass.Object.getValue() | NodeClass.Variable.getValue()); UInteger resultMask = uint(BrowseResultMask.All.getValue()); CompletableFuture<BrowseResult> future = client.browse( new BrowseDescription( nodeId, BrowseDirection.Forward, Identifiers.HasComponent, false, nodeClassMask, resultMask ) ); return future.thenCompose(result -> { List<ReferenceDescription> references = l(result.getReferences()); Optional<CompletableFuture<? extends Node>> node = references.stream() .filter(r -> browseName.equals(r.getBrowseName())) .flatMap(r -> { Optional<CompletableFuture<? extends Node>> opt = r.getNodeId().local().map( id -> client.getAddressSpace().createNode(id) ); return opt2stream(opt); }) .findFirst(); return node.orElse(failedUaFuture(StatusCodes.Bad_NotFound)); }); }
private CompletableFuture<List<NodeId>> browseDataTypeEncodingNodeIds(List<NodeId> nodeIds) { Stream<CompletableFuture<NodeId>> futures = nodeIds.stream().map(nodeId -> { CompletableFuture<BrowseResult> browse = browseNode(new BrowseDescription( nodeId, BrowseDirection.Inverse, Identifiers.HasDescription, false, uint(NodeClass.Object.getValue()), uint(BrowseResultMask.All.getValue()) )); return browse.thenApply(result -> { Optional<ReferenceDescription> ref = s(result.getReferences()) .filter(r -> QN_DEFAULT_BINARY.equals(r.getBrowseName()) && Identifiers.DataTypeEncodingType.expanded().equals(r.getTypeDefinition())) .findFirst(); return ref.map(r -> r.getNodeId().local().orElse(NodeId.NULL_VALUE)).orElse(NodeId.NULL_VALUE); }); }); return FutureUtils.sequence(futures); }
public CompletableFuture<? extends ObjectTypeNode> getTypeDefinition() { UInteger nodeClassMask = uint(NodeClass.ObjectType.getValue()); UInteger resultMask = uint(BrowseResultMask.All.getValue()); CompletableFuture<BrowseResult> future = client.browse( new BrowseDescription( nodeId, BrowseDirection.Forward, Identifiers.HasTypeDefinition, false, nodeClassMask, resultMask ) ); return future.thenCompose(result -> { List<ReferenceDescription> references = l(result.getReferences()); Optional<ObjectTypeNode> node = references.stream() .flatMap(r -> { Optional<ObjectTypeNode> opt = r.getNodeId().local().map( id -> client.getAddressSpace().createObjectTypeNode(id)); return opt2stream(opt); }) .findFirst(); return node.map(CompletableFuture::completedFuture) .orElse(failedUaFuture(StatusCodes.Bad_NotFound)); }); }
public CompletableFuture<? extends VariableTypeNode> getTypeDefinition() { UInteger nodeClassMask = uint(NodeClass.VariableType.getValue()); UInteger resultMask = uint(BrowseResultMask.All.getValue()); CompletableFuture<BrowseResult> future = client.browse( new BrowseDescription( nodeId, BrowseDirection.Forward, Identifiers.HasTypeDefinition, false, nodeClassMask, resultMask ) ); return future.thenCompose(result -> { List<ReferenceDescription> references = l(result.getReferences()); Optional<VariableTypeNode> node = references.stream() .flatMap(r -> { Optional<VariableTypeNode> opt = r.getNodeId().local().map( id -> client.getAddressSpace().createVariableTypeNode(id)); return opt2stream(opt); }) .findFirst(); return node.map(CompletableFuture::completedFuture) .orElse(FutureUtils.failedUaFuture(StatusCodes.Bad_NotFound)); }); }
private CompletableFuture<List<NodeId>> browseDataTypeDescriptionNodeIds(NodeId dictionaryNodeId) { CompletableFuture<BrowseResult> browseResult = browseNode( new BrowseDescription( dictionaryNodeId, BrowseDirection.Forward, Identifiers.HasComponent, false, uint(NodeClass.Variable.getValue()), uint(BrowseResultMask.All.getValue()) ) ); return browseResult.thenApply(result -> s(result.getReferences()) .filter(r -> Identifiers.DataTypeDescriptionType.expanded().equals(r.getTypeDefinition())) .flatMap(r -> opt2stream(r.getNodeId().local())) .collect(Collectors.toList()) ); }
protected CompletableFuture<PropertyNode> getPropertyNode(QualifiedName browseName) { UInteger nodeClassMask = uint(NodeClass.Variable.getValue()); UInteger resultMask = uint(BrowseResultMask.BrowseName.getValue()); CompletableFuture<BrowseResult> future = client.browse( new BrowseDescription( nodeId, BrowseDirection.Forward, Identifiers.HasProperty, false, nodeClassMask, resultMask ) ); return future.thenCompose(result -> { List<ReferenceDescription> references = l(result.getReferences()); Optional<PropertyNode> node = references.stream() .filter(r -> browseName.equals(r.getBrowseName())) .flatMap(r -> { Optional<PropertyNode> opt = r.getNodeId().local() .map(id -> new PropertyNode(client, id)); return opt2stream(opt); }) .findFirst(); return node .map(CompletableFuture::completedFuture) .orElse(failedUaFuture(StatusCodes.Bad_NotFound)); }); }
public CompletableFuture<? extends ObjectNode> getObjectComponent(QualifiedName browseName) { UInteger nodeClassMask = uint(NodeClass.Object.getValue()); UInteger resultMask = uint(BrowseResultMask.All.getValue()); CompletableFuture<BrowseResult> future = client.browse( new BrowseDescription( nodeId, BrowseDirection.Forward, Identifiers.HasComponent, false, nodeClassMask, resultMask ) ); return future.thenCompose(result -> { List<ReferenceDescription> references = l(result.getReferences()); Optional<CompletableFuture<ObjectNode>> node = references.stream() .filter(r -> browseName.equals(r.getBrowseName())) .flatMap(r -> { Optional<CompletableFuture<ObjectNode>> opt = r.getNodeId().local().map( id -> client.getAddressSpace().getObjectNode(id) ); return opt2stream(opt); }) .findFirst(); return node.orElse(failedUaFuture(StatusCodes.Bad_NotFound)); }); }
public CompletableFuture<? extends VariableNode> getVariableComponent(QualifiedName browseName) { UInteger nodeClassMask = uint(NodeClass.Variable.getValue()); UInteger resultMask = uint(BrowseResultMask.All.getValue()); CompletableFuture<BrowseResult> future = client.browse( new BrowseDescription( nodeId, BrowseDirection.Forward, Identifiers.HasComponent, false, nodeClassMask, resultMask ) ); return future.thenCompose(result -> { List<ReferenceDescription> references = l(result.getReferences()); Optional<CompletableFuture<VariableNode>> node = references.stream() .filter(r -> browseName.equals(r.getBrowseName())) .flatMap(r -> { Optional<CompletableFuture<VariableNode>> opt = r.getNodeId().local().map( id -> client.getAddressSpace().getVariableNode(id) ); return opt2stream(opt); }) .findFirst(); return node.orElse(failedUaFuture(StatusCodes.Bad_NotFound)); }); }
public CompletableFuture<? extends VariableNode> getVariableComponent(QualifiedName browseName) { UInteger nodeClassMask = uint(NodeClass.Variable.getValue()); UInteger resultMask = uint(BrowseResultMask.All.getValue()); CompletableFuture<BrowseResult> future = client.browse( new BrowseDescription( nodeId, BrowseDirection.Forward, Identifiers.HasComponent, false, nodeClassMask, resultMask ) ); return future.thenCompose(result -> { List<ReferenceDescription> references = l(result.getReferences()); Optional<CompletableFuture<VariableNode>> node = references.stream() .filter(r -> browseName.equals(r.getBrowseName())) .flatMap(r -> { Optional<CompletableFuture<VariableNode>> opt = r.getNodeId().local().map( id -> client.getAddressSpace().getVariableNode(id) ); return opt2stream(opt); }) .findFirst(); return node.orElse(failedUaFuture(StatusCodes.Bad_NotFound)); }); }