Search in sources :

Example 1 with CodecDescription

use of org.eclipse.milo.opcua.binaryschema.parser.CodecDescription in project milo by eclipse.

the class DataTypeDictionaryReader method registerCustomStructCodecs.

private CompletableFuture<DataTypeDictionary<?>> registerCustomStructCodecs(NodeId dictionaryNodeId, OpcUaBinaryDataTypeDictionary dictionary, List<CodecDescription> structCodecs) {
    CompletableFuture<List<NodeId>> descriptionNodeIds = browseDataTypeDescriptionNodeIds(dictionaryNodeId);
    CompletableFuture<List<String>> descriptionValues = descriptionNodeIds.thenCompose(this::readDataTypeDescriptionValues);
    if (logger.isTraceEnabled()) {
        try {
            List<NodeId> ids = descriptionNodeIds.get();
            List<String> values = descriptionValues.get();
            if (ids.size() != values.size()) {
                throw new IllegalStateException("size mismatch");
            }
            for (int i = 0; i < ids.size(); i++) {
                NodeId id = ids.get(i);
                String value = values.get(i);
                logger.trace("description NodeId={} value={}", id, value);
            }
        } catch (Exception e) {
            logger.error("Error reading description NodeIds", e);
        }
    }
    CompletableFuture<List<NodeId>> encodingIdsFuture = descriptionNodeIds.thenCompose(this::browseDataTypeEncodingNodeIds);
    return encodingIdsFuture.thenCompose(encodingIds -> browseDataTypeIds(encodingIds).thenCompose(dataTypeIds -> descriptionValues.thenApply(descriptions -> {
        Map<String, NodeId> encodingIdMap = new HashMap<>();
        Map<String, NodeId> dataTypeIdMap = new HashMap<>();
        if (descriptions.size() != encodingIds.size()) {
            throw new IllegalStateException(String.format("descriptions.size() != encodingIds.size() (%s != %s)", descriptions.size(), encodingIds.size()));
        }
        if (encodingIds.size() != dataTypeIds.size()) {
            throw new IllegalStateException(String.format("encodingIds.size() != dataTypeIds.size() (%s != %s)", encodingIds.size(), dataTypeIds.size()));
        }
        Iterator<String> descriptionIter = descriptions.iterator();
        Iterator<NodeId> encodingIdIter = encodingIds.iterator();
        Iterator<NodeId> dataTypeIdIter = dataTypeIds.iterator();
        while (descriptionIter.hasNext() && encodingIdIter.hasNext() && dataTypeIdIter.hasNext()) {
            String description = descriptionIter.next();
            encodingIdMap.put(description, encodingIdIter.next());
            dataTypeIdMap.put(description, dataTypeIdIter.next());
        }
        structCodecs.forEach(cd -> {
            String description = cd.getDescription();
            NodeId encodingId = encodingIdMap.get(description);
            NodeId dataTypeId = dataTypeIdMap.get(description);
            if (encodingId == null || encodingId.isNull()) {
                if (dataTypeId != null && dataTypeId.getNamespaceIndex().intValue() != 0) {
                    logger.warn("encodingId is null for description={}", description);
                } else {
                    // Theres a number of missing structures in the built-in type dictionary;
                    // namely the service request and response structures. It's expected that
                    // we won't be able to create codecs for these.
                    logger.debug("dataTypeId and encodingId is null for description={}", description);
                }
            } else if (dataTypeId == null || dataTypeId.isNull()) {
                logger.warn("dataTypeId is null for description={}", description);
            } else {
                dictionary.registerStructCodec(cd.getCodec(), description, dataTypeId, encodingId);
                logger.debug("Registered codec description={} dataTypeId={} encodingId={}", description, dataTypeId, encodingId);
            }
        });
        return dictionary;
    })));
}
Also used : BrowseNextRequest(org.eclipse.milo.opcua.stack.core.types.structured.BrowseNextRequest) CompletableFuture.completedFuture(java.util.concurrent.CompletableFuture.completedFuture) ByteString(org.eclipse.milo.opcua.stack.core.types.builtin.ByteString) LoggerFactory(org.slf4j.LoggerFactory) ReadRequest(org.eclipse.milo.opcua.stack.core.types.structured.ReadRequest) DateTime(org.eclipse.milo.opcua.stack.core.types.builtin.DateTime) DictionaryDescription(org.eclipse.milo.opcua.binaryschema.parser.DictionaryDescription) Unpooled(io.netty.buffer.Unpooled) QualifiedName(org.eclipse.milo.opcua.stack.core.types.builtin.QualifiedName) ByteArrayInputStream(java.io.ByteArrayInputStream) Unsigned.uint(org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.Unsigned.uint) BrowseDescription(org.eclipse.milo.opcua.stack.core.types.structured.BrowseDescription) Map(java.util.Map) AttributeId(org.eclipse.milo.opcua.stack.core.AttributeId) TimestampsToReturn(org.eclipse.milo.opcua.stack.core.types.enumerated.TimestampsToReturn) NodeId(org.eclipse.milo.opcua.stack.core.types.builtin.NodeId) BrowseResult(org.eclipse.milo.opcua.stack.core.types.structured.BrowseResult) ReferenceDescription(org.eclipse.milo.opcua.stack.core.types.structured.ReferenceDescription) BrowseDirection(org.eclipse.milo.opcua.stack.core.types.enumerated.BrowseDirection) BsdParser(org.eclipse.milo.opcua.binaryschema.parser.BsdParser) Collectors(java.util.stream.Collectors) JAXBException(javax.xml.bind.JAXBException) CodecDescription(org.eclipse.milo.opcua.binaryschema.parser.CodecDescription) ReadValueId(org.eclipse.milo.opcua.stack.core.types.structured.ReadValueId) Objects(java.util.Objects) CompositeByteBuf(io.netty.buffer.CompositeByteBuf) List(java.util.List) CompletionStage(java.util.concurrent.CompletionStage) Stream(java.util.stream.Stream) Lists.newArrayList(com.google.common.collect.Lists.newArrayList) NodeClass(org.eclipse.milo.opcua.stack.core.types.enumerated.NodeClass) StatusCode(org.eclipse.milo.opcua.stack.core.types.builtin.StatusCode) FutureUtils(org.eclipse.milo.opcua.stack.core.util.FutureUtils) ByteStreams(com.google.common.io.ByteStreams) Optional(java.util.Optional) StreamUtil.opt2stream(org.eclipse.milo.opcua.sdk.core.util.StreamUtil.opt2stream) BrowseResponse(org.eclipse.milo.opcua.stack.core.types.structured.BrowseResponse) OpcUaSession(org.eclipse.milo.opcua.sdk.client.OpcUaSession) Identifiers(org.eclipse.milo.opcua.stack.core.Identifiers) BrowseRequest(org.eclipse.milo.opcua.stack.core.types.structured.BrowseRequest) DataTypeDictionary(org.eclipse.milo.opcua.stack.core.types.DataTypeDictionary) DataValue(org.eclipse.milo.opcua.stack.core.types.builtin.DataValue) OpcUaBinaryDataTypeDictionary(org.eclipse.milo.opcua.stack.core.types.OpcUaBinaryDataTypeDictionary) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) ArrayList(java.util.ArrayList) RequestHeader(org.eclipse.milo.opcua.stack.core.types.structured.RequestHeader) Lists(com.google.common.collect.Lists) ByteBuf(io.netty.buffer.ByteBuf) ConversionUtil.l(org.eclipse.milo.opcua.stack.core.util.ConversionUtil.l) ReadResponse(org.eclipse.milo.opcua.stack.core.types.structured.ReadResponse) BrowseNextResponse(org.eclipse.milo.opcua.stack.core.types.structured.BrowseNextResponse) StatusCodes(org.eclipse.milo.opcua.stack.core.StatusCodes) Logger(org.slf4j.Logger) Iterator(java.util.Iterator) UaStackClient(org.eclipse.milo.opcua.stack.client.UaStackClient) UInteger(org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.UInteger) IOException(java.io.IOException) Ints(com.google.common.primitives.Ints) ViewDescription(org.eclipse.milo.opcua.stack.core.types.structured.ViewDescription) BrowseResultMask(org.eclipse.milo.opcua.stack.core.types.enumerated.BrowseResultMask) FutureUtils.failedFuture(org.eclipse.milo.opcua.stack.core.util.FutureUtils.failedFuture) Preconditions(com.google.common.base.Preconditions) Collections(java.util.Collections) InputStream(java.io.InputStream) Namespaces(org.eclipse.milo.opcua.stack.core.util.Namespaces) HashMap(java.util.HashMap) ByteString(org.eclipse.milo.opcua.stack.core.types.builtin.ByteString) Unsigned.uint(org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.Unsigned.uint) JAXBException(javax.xml.bind.JAXBException) IOException(java.io.IOException) NodeId(org.eclipse.milo.opcua.stack.core.types.builtin.NodeId) List(java.util.List) Lists.newArrayList(com.google.common.collect.Lists.newArrayList) ArrayList(java.util.ArrayList)

Example 2 with CodecDescription

use of org.eclipse.milo.opcua.binaryschema.parser.CodecDescription in project milo by eclipse.

the class DataTypeDictionaryReader method createDataTypeDictionary.

private CompletableFuture<DataTypeDictionary<?>> createDataTypeDictionary(NodeId dictionaryNodeId, ByteString bs) {
    ByteArrayInputStream is = new ByteArrayInputStream(bs.bytesOrEmpty());
    try {
        DictionaryDescription dictionaryDescription = bsdParser.parse(is);
        String namespaceUri = dictionaryDescription.getNamespaceUri();
        OpcUaBinaryDataTypeDictionary dictionary = new OpcUaBinaryDataTypeDictionary(namespaceUri);
        List<CodecDescription> enumCodecs = dictionaryDescription.getEnumCodecs();
        enumCodecs.forEach(cd -> dictionary.registerEnumCodec(cd.getCodec(), cd.getDescription()));
        logger.debug("enumCodecs.size()={}", enumCodecs.size());
        List<CodecDescription> structCodecs = dictionaryDescription.getStructCodecs();
        logger.debug("structCodecs.size()={}", structCodecs.size());
        if (Namespaces.OPC_UA.equals(namespaceUri)) {
            return registerBuiltinStructCodecs(dictionary, structCodecs);
        } else {
            return registerCustomStructCodecs(dictionaryNodeId, dictionary, structCodecs);
        }
    } catch (JAXBException e) {
        return failedFuture(e);
    }
}
Also used : CodecDescription(org.eclipse.milo.opcua.binaryschema.parser.CodecDescription) ByteArrayInputStream(java.io.ByteArrayInputStream) JAXBException(javax.xml.bind.JAXBException) ByteString(org.eclipse.milo.opcua.stack.core.types.builtin.ByteString) DictionaryDescription(org.eclipse.milo.opcua.binaryschema.parser.DictionaryDescription) OpcUaBinaryDataTypeDictionary(org.eclipse.milo.opcua.stack.core.types.OpcUaBinaryDataTypeDictionary)

Aggregations

ByteArrayInputStream (java.io.ByteArrayInputStream)2 JAXBException (javax.xml.bind.JAXBException)2 CodecDescription (org.eclipse.milo.opcua.binaryschema.parser.CodecDescription)2 DictionaryDescription (org.eclipse.milo.opcua.binaryschema.parser.DictionaryDescription)2 OpcUaBinaryDataTypeDictionary (org.eclipse.milo.opcua.stack.core.types.OpcUaBinaryDataTypeDictionary)2 ByteString (org.eclipse.milo.opcua.stack.core.types.builtin.ByteString)2 Preconditions (com.google.common.base.Preconditions)1 Lists (com.google.common.collect.Lists)1 Lists.newArrayList (com.google.common.collect.Lists.newArrayList)1 ByteStreams (com.google.common.io.ByteStreams)1 Ints (com.google.common.primitives.Ints)1 ByteBuf (io.netty.buffer.ByteBuf)1 CompositeByteBuf (io.netty.buffer.CompositeByteBuf)1 Unpooled (io.netty.buffer.Unpooled)1 IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 ArrayList (java.util.ArrayList)1 Collections (java.util.Collections)1 HashMap (java.util.HashMap)1 Iterator (java.util.Iterator)1