Как получить доступ к экземплярам узлов, созданным NodeFactory на стороне сервера в Eclipse Milo? - PullRequest
0 голосов
/ 02 октября 2018

Относительно реализации на стороне сервера: каков наилучший способ доступа (и изменения) к конкретным экземплярам узлов, созданным NodeFactory?Например, в NameSpaceExample есть пользовательский тип объекта MyObjectType с компонентами «foo» и «bar».

// Define a new ObjectType called "MyObjectType".
    UaObjectTypeNode objectTypeNode = UaObjectTypeNode.builder(server.getNodeMap())
        .setNodeId(new NodeId(namespaceIndex, "ObjectTypes/MyObjectType"))
        .setBrowseName(new QualifiedName(namespaceIndex, "MyObjectType"))
        .setDisplayName(LocalizedText.english("MyObjectType"))
        .setIsAbstract(false)
        .build();

    // "Foo" and "Bar" are members. These nodes are what are called "instance declarations" by the spec.
    UaVariableNode foo = UaVariableNode.builder(server.getNodeMap())
        .setNodeId(new NodeId(namespaceIndex, "ObjectTypes/MyObjectType.Foo"))
        .setAccessLevel(ubyte(AccessLevel.getMask(AccessLevel.READ_WRITE)))
        .setBrowseName(new QualifiedName(namespaceIndex, "Foo"))
        .setDisplayName(LocalizedText.english("Foo"))
        .setDataType(Identifiers.Int16)
        .setTypeDefinition(Identifiers.BaseDataVariableType)
        .build();

    foo.setValue(new DataValue(new Variant(0)));
    objectTypeNode.addComponent(foo);

    UaVariableNode bar = UaVariableNode.builder(server.getNodeMap())
        .setNodeId(new NodeId(namespaceIndex, "ObjectTypes/MyObjectType.Bar"))
        .setAccessLevel(ubyte(AccessLevel.getMask(AccessLevel.READ_WRITE)))
        .setBrowseName(new QualifiedName(namespaceIndex, "Bar"))
        .setDisplayName(LocalizedText.english("Bar"))
        .setDataType(Identifiers.String)
        .setTypeDefinition(Identifiers.BaseDataVariableType)
        .build();

    bar.setValue(new DataValue(new Variant("bar")));
    bar.addReference(new Reference(bar.getNodeId(), Identifiers.HasModellingRule, Identifiers.ModellingRule_MandatoryPlaceholder.expanded(), NodeClass.ObjectType, true));
    objectTypeNode.addComponent(bar);


    // Tell the ObjectTypeManager about our new type.
    // This let's us use NodeFactory to instantiate instances of the type.
    server.getObjectTypeManager().registerObjectType(
        objectTypeNode.getNodeId(),
        UaObjectNode.class,
        UaObjectNode::new
    );

    // Add our ObjectTypeNode as a subtype of BaseObjectType.
    server.getUaNamespace().addReference(
        Identifiers.BaseObjectType,
        Identifiers.HasSubtype,
        true,
        objectTypeNode.getNodeId().expanded(),
        NodeClass.ObjectType
    );

    // Add the inverse SubtypeOf relationship.
    objectTypeNode.addReference(new Reference(
        objectTypeNode.getNodeId(),
        Identifiers.HasSubtype,
        Identifiers.BaseObjectType.expanded(),
        NodeClass.ObjectType,
        false
    ));

    // Add it into the address space.
    server.getNodeMap().addNode(objectTypeNode);

    // Use NodeFactory to create instance of MyObjectType called "MyObject".
    // NodeFactory takes care of recursively instantiating MyObject member nodes
    // as well as adding all nodes to the address space.
    UaObjectNode myObject = nodeFactory.createObject(
        new NodeId(namespaceIndex, "HelloWorld/MyObject"),
        new QualifiedName(namespaceIndex, "MyObject"),
        LocalizedText.english("MyObject"),
        objectTypeNode.getNodeId()
    );



    // Add forward and inverse references from the root folder.
    rootFolder.addOrganizes(myObject);

    myObject.addReference(new Reference(
        myObject.getNodeId(),
        Identifiers.Organizes,
        rootFolder.getNodeId().expanded(),
        rootFolder.getNodeClass(),
        false
    ));

С фабрикой узлов создается экземпляр MyObject MyObjectType, который имеет (из-заопределение типа) компоненты "foo" и "bar".Какой лучший способ получить к ним доступ?На стороне клиента это будет что-то вроде

VariableNode node = client.getAddressSpace().createVariableNode(new NodeId(namespaceIndex, "HelloWorld/MyObject"));

Я знаю, что можно получить ссылки на MyObject и следовать им, но должен быть лучший способ.

Любой вклад очень ценится!

1 Ответ

0 голосов
/ 03 октября 2018

Вы должны получить их, просматривая ссылки или выводя NodeId на данный момент.

Новая работа NodeFactory завершена, и в PR ожидается ветка 0.3, так что, надеюсь, пройдет немного времени, пока вы не сможете использовать реализацию NodeFactory.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...