Работа с контекстами

Первоначальный объект, предоставляющий доступ к дереву контекстов, реализует интерфейс ContextManager. Существует несколько методов получения менеджера контекстов.

Получение менеджера контекстов

Метод получения экземпляра ContextManager зависит от текущей среды:

  • При разработке приложения с помощью SberMobile Server API используйте RemoteServerController.getContextManager() для получения дерева контекстов удаленного сервера
  • При разработке драйвера устройства используйте DeviceContext.getContextManager() для получения менеджера дерева контекстов
  • При разработке плагина менеджер контекстов передается как параметр при помощи методов install(ContextManager cm) и deinstall(ContextManager cm). В случае применения методов install(ServerContext context) и deinstall(ServerContext context) используйте ServerContext.getContextManager().
  • При разработке Агента на Java помните, что у вашего Агента есть только один контекст. Однако получить доступ в его менеджер контекстов можно через Agent.getContext().getContextManager().
  • При написании скрипта сервера вызовите ScriptExecutionEnvironment.getScriptContext().getContextManager() для получения доступа в менеджер контекстов сервера.
  • При написании скрипта виджетов вызовите WidgetScriptExecutionEnvironment.getEngine().getServerContextManager() для получения доступа в менеджер контекстов удаленного сервера. Также можно вызвать WidgetScriptExecutionEnvironment.getComponentContext("componentName").getContextManager() для получения доступа в менеджер контекстов дерева контекстов компонентов виджета.

Права доступа

Экземпляр объекта CallerController, включающий текущие права доступа пользователя, должен передаваться в большинство вызовов, относящихся к контексту, если вы пишете код, работающий в виртуальной машине Java SberMobile Server (т.е. при разработке скрипта сервера или плагина). Если этого не сделать, результаты различных исключений отказа в доступе будут нулевыми.

Для получения более подробной информации см. Работа с правами доступа.

Получение индивиуальных контекстов

Есть два вида основных путей, помогающие контексту иметь свой собственный путь:

  • Вызвать get(String path) или метод get(String path, CallerController caller) от Context
  • Вызвать get(String path) или метод get(String path, CallerController caller) от ContextManager

Они обычно возвращают тот же самый результат, если только не будут использованы в распределенной архитектуре. Однако в распределенной среде их поведение будет полностью иным:

  • Методы интерпретации ContextManager предоставляют строку path как локальный путь на сервере, которому принадлежит ContextManager.
  • Методы интерпретации Context предоставляют строку path как путь на удаленном сервере, которому принадлежит Context. Он валиден, если контекст прокси представляет удаленное соседнее устройство посредством распределенной архитектуры.

Поэтому вызов методов get() от Context - это предпочтительное поведение. Вызов методов get() от ContextManager часто может быть причиной непредсказуемых результатов в распределенной инсталляции.

Пример получения контекста с указанным путем.

Context deviceContext = anotherContext.get("users.admin.devices.device1");

Метод get() вернет null, если запрашиваемый контекст не существует или недоступен с этими правами доступа.

Использование метода get() от Context, чтобы получить другой контекст, означает, что всегда должны быть контексты, из которых можно вызвать этот метод. Это может означать дополнительное планирование и обдумывание на протяжении фазы разработки, в то время как код, который использует методы get() от ContextManager, все еще хорошо работает в нераспределенной среде разработки. Однако в основном этот ошибочный код в дальнейшем перестает работать в нераспределенной рабочей среде.

Используйте Context.getParent() и Context.getChild(String name) при работе с особым контекстом, чтобы иметь доступ к их родительским и дочерним контекстам соответственно.

Используйте узел ContextManager.getRoot(), чтобы получить доступ к корню контекста дерева контекстов.

Использование вспомогательных методов

Константы, определенные в классе Contexts, и статические методы класса ContextUtils обеспечивают удобные способы для построения путей различных контекстов сервера, таких как Тревоги или контексты Device.

Пример: Context alertContext = contextManager.get(ContextUtils.alertContextPath("admin", "myalert"));

Обработка списка дочерних контекстов

Для получения списка дочерних контекстов определенного контекста вызовите Context.getChildren().

  • Вызов сервера getChildren(CallerController caller) вернет только те дочерние контексты, которые доступны вызывающему пользователю (представленному в виде CallerController).
  • Вызов getChildren() прокси-контекста (т.е. при использовании удаленного API или разработке Агента) вернет только те дочерние контексты, которые доступны пользователю, аутентифицированному в текущем соединении сервера.
  • Получение контекстной информации

    Интерфейс Context имеет несколько методов получения основной информации о контексте:

    • getName()
    • getPath()
    • getDescription()
    • getType()
    • getGroup()

    Контексты прокси

    Если вы разрабатываете код, работающий в SberMobile IIoT Platform Client или в любом другом приложении и получаете Context посредством API, результатом будет получение контекста прокси, который соединяется с удаленным соседним устройством на стороне сервера. Таким образом, даже наипростейшие вызовы метода могут стать результатом ввода/вывода сети и надолго отложатся или даже прекратят работу из-за ошибок сети.