Работа с контекстами
Первоначальный объект, предоставляющий доступ к дереву контекстов, реализует интерфейс 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() вернет null, если запрашиваемый контекст не существует или недоступен с этими правами доступа. 
|  | Использование метода  | 
Используйте Context.getParent() и Context.getChild(String name) при работе с особым контекстом, чтобы иметь доступ к их родительским и дочерним контекстам соответственно.
Используйте узел ContextManager.getRoot(), чтобы получить доступ к корню контекста дерева контекстов.
Использование вспомогательных методов
|  | Константы, определенные в классе  Пример:  | 
Обработка списка дочерних контекстов
Для получения списка дочерних контекстов определенного контекста вызовите Context.getChildren().
|  | getChildren(CallerController caller)вернет только те дочерние контексты, которые доступны вызывающему пользователю (представленному в видеCallerController).getChildren()прокси-контекста (т.е. при использовании удаленного API или разработке Агента) вернет только те дочерние контексты, которые доступны пользователю, аутентифицированному в текущем соединении сервера. | 
Получение контекстной информации
Интерфейс Context имеет несколько методов получения основной информации о контексте:
- getName()
- getPath()
- getDescription()
- getType()
- getGroup()
Контексты прокси
Если вы разрабатываете код, работающий в SberMobile IIoT Platform Client или в любом другом приложении и получаете Context посредством API, результатом будет получение контекста прокси, который соединяется с удаленным соседним устройством на стороне сервера. Таким образом, даже наипростейшие вызовы метода могут стать результатом ввода/вывода сети и надолго отложатся или даже прекратят работу из-за ошибок сети.