Видимое и действительное дерево контекстов

Данный раздел посвящен объяснению различия между видимым Деревом контекстов и серверным Деревом контекстов.

Необходимо знать, что структура дерева контекстов, видимого в Системном дереве и подобных компонентах (таких как Селектор объектов) не совпадает полностью со структурой дерева контекстов AggreGate Server. Для удобства пользования, узлы, которые относятся к одному серверному контексту, могут появиться в двух, трех и более местах Системного дерева.

Например, один контекст устройства, представляющий аппаратное устройство, может появиться одновременно:

  • Под узлом Устройства, объединяющим все устройства в системе (контекстный путь — просто devices)

  • Под узлом Устройства, показывающим устройства активного пользователя (контекстный путь — users.<username>.devices), где <username> — имя пользователя владельца устройства.

  • И под одним или несколькими узлами Группа устройств (контекстный путь — users.<username>.devgroups.<group1>)

На приведенном выше рисунке, узлы, на которые указывают стрелки, относятся к одному серверному контексту. При наведении курсора мыши на узел Системного дерева, появится всплывающая подсказка, в которой указан его абсолютный серверный путь:

Данное различие может стать причиной неожиданных результатов при проверке путей контекстов, видимых в дереве. Например, дерево может включать в себя контекст Устройство ABC, который расположен в Корень > Устройства. Однако, настоящий серверный путь к данному контексту является users.Owner_Name.devices.deviceABC, где Owner_Name - пользователь AggreGate Server, которому принадлежит устройство. Серверный контекст Устройства не имеет действительных потомков, т.к. он является так называемым отображенным контекстом.

На контексты можно ссылаться только напрямую по их абсолютному пути. Например, аргумент context относящейся к контексту функции getVariable(context, variable) должен быть абсолютным путем целевого контекста.

Пример: предположим, что пользователь-администратор создал виртуальное устройство «virtual» и добавил его в группу устройств «genericGroup». В этом случае при ссылке на контекст virtual обратите внимание на следующее:

  • Абсолютный контекстный путь виртуального устройства: users.admin.devices.virtual.

  • В дереве контекста сервера устройство будет иметь видимые контекстные пути users.admin.devgroups.genericGroup.virtural и devices.virtual.

  • Виртуальное устройство БУДЕТ соответствовать контекстным маскам users.admin.devgroups.genericGroup.* и devices.* и будет включено в результат при использовании такой функции, как aggregate("users.admin.devgroups.genericGroup.*","dc()","").

  • Виртуальное устройство НЕ БУДЕТ соответствовать никакому контекстному пути, который не является его точным абсолютным путем. А именно, видимый контекстный путь users.admin.devgroups.genericGroup.virtural не будет ссылаться на устройство. Например, вызов функции getVariable("users.admin.devgroups.genericGroup.virtural","info") приведет к ошибке.

Пути контейнеров

Неопытные пользователи AggreGate иногда путают "действительные" и "отображаемые" контексты контейнеров.

Большинство контекстов в корне системного дерева отображаемые. Например, если вы наведете мышку на узел Устройства, вы увидите, что его путь контекста - это devices:

Если вы развернете этот узел и проверите путь контекста устройства, расположенного прямо под ним, вы увидите, что его путь users.admin.devices.virtual:

Это означает, что действительный контейнер нашего устройства под названием virtual - это users.admin.devices. Он принадлежит пользователю системы с именем admin. Мы можем найти этот действительный контейнер, пройдя путь Users => admin (Administrator) => Devices:

Большинство контекстов контейнеров в корне видимого системного дерева отображаемые, т.е. узел Queries показывает доступные запросы всех пользователей и т.д.

Однако контексты групп, расположенные в контекстах этих контейнеров, не отображаемые, т.е. узел Query Groups, расположенный в корне узла Queries, показывает только группы, доступные для текущего пользователя. Например, чтобы посмотреть группы запросов, доступные другим пользователям, следуйте Users > User > Queries > Query Groups.

Was this page helpful?