Скрипты виджетов

Скрипты виджета позволяют выполнять операции пользователя с компонентами виджета и данными сервера. Скрипты написаны на языке Java. Каждый скрипт выполняется в Java Virtual Machine (JVM), в которой выполняется виджет (это может быть JVM, запускающая SberMobile IIoT Platform Client или SberMobile Server JVM, если виджет запускается в веб-интерфейсе). Таким образом, скрипт имеет доступ ко всем объектам внутренней памяти и струткурам виджета. Скрипты дают вам возможность полностью контролировать виджет.

Права доступа скрипта никак не ограничены. Одна случайная ошибка в скрипте или враждебный программный код могут привести к неправильному функционированию %ag%> сервера или клиента, к их зависанию, 100% загрузке процессора, повреждению данных или даже повреждению данных устройства, которое запустило скрипт!

Запуск выполнения скрипта

Скрипт виджета выполняется в двух случаях:

Скрипты создаются в потоке обработки привязки, поэтому их выполнение может занимать много времени с учетом обработки других привязок виджета. Рекомендуется создавать новые потоки для выполнения задач скриптов виджета, требующих большого количества времени.

Управление скриптами

Скрипты создаются и управляются редактированием свойств Скриптов корневой панели виджета.

Интерфейс скрипта

Каждый скрипт является классом Java, который должен выполнять интерфейс WidgetScript:

public interface WidgetScript

{

  public void execute(WidgetScriptExecutionEnvironment environment, Object parameter);

}

Данный интерфейс определяет метод execute(), который вызывается при выполнении скрипта.

Результат выполнения выражения привязки передается скрипту виджета в качестве объекта parameter.

Среда выполнения скрипта

Каждый скрипт имеет доступ к объекту, выполняющему интерфейс WidgetScriptExecutionEnvironment, который передается как аргумент для метода execute(). WidgetScriptExecutionEnvironment выглядит следующим образом:

public interface WidgetScript

{

  public void execute(WidgetScriptExecutionEnvironment environment, Object parameter);

}

 

Экземпляр WidgetScriptExecutionEnvironment обеспечивает доступ к объекту, выполняющему интерфейс GUIEngine (получить интерфейс можно путем вызова метода getEngine()). GUIEngine обеспечивает доступ к объектам, отвечающим за выполнение виджета.

Метод getCause() возвращает ссылку (объект типа "ссылка"), которая инициирует обработку привязки,  вызвавшую выполнение скрипта. Данная ссылка может указывать на данные контекста или свойство компонента виджета.

Шаблон скрипта

При создании нового скрипта его текст непустой. Он содержит автоматически генерируемый класс с пустым методом execute(). Далее приведен текст скрипта по умолчанию:

import com.tibbo.platform.guibuilder.*;

public class users_admin_widgets_scripts_refresh implements WidgetScript

{

  public void execute(WidgetScriptExecutionEnvironment environment, Object parameter)

  {

  }

}

Разработка скриптов

См. раздел Общие указания по программированию для получения информации о разработке скриптов виджетов SberMobile.

Написание скриптов

По сути скрипты должны выполнять следующее:

  • Читать/записывать свойства компонентов виджета
  • Генерировать события компонентов виджета
  • Читать/записывать переменные контекста сервера (т.е. настройки аппартаного устройства и свойства ресурсов сервера)
  • Вызывать операции сервера и устройства (функции)

В большинстве случаев все операции должны производиться через интерфейс Context.

Для получения Context, соответствующего любому объекту сервера, используйте следующий код:

WidgetEngine engine = environment.getEngine();

ContextManager contextManager = engine.getServerContextManager();

Context serverContext = contextManager.get("server.context.path");

Для получения Context, соответствующего определенному компоненту виджета, используйте следующий код:

Context componentContext = environment.getComponentContext("widget_component_name");

Когда извлекается экземпляр Context, вы можете читать/записывать переменные, используя методы getVariable() и setVariable(). Для контекстов компонента виджета большинство переменных напрямую соответствуют свойствам компонента (т.е. Шрифт, Ширина, Цвет и т.д.)

Пример 1: Обработка свойства компонента

Например, для применения пользовательской обработки к Таблице Данных, хранящейся в компоненте Редактор Таблицы Данных, используйте следующий код:

Context dataTableEditorContext = environment.getComponentContext("dataTableEditor1");

DataTable dataTable = dataTableEditorContext.getVariable("dataTable");

// Process the data here

Пример 2: Закрытие другого виджета

Этот пример иллюстрирует, как один виджет закрывает другой виджет при помощи щелчка мыши.

Скрипт вызывает статический метод ClientUtils.removeFrame() и передает ключу фрейма действие к закрытию. Ключ фрейма виджета создается методом ClientUtils.createWidgetFrameKey(), который принимает путь контекста виджета и путь его контекста по умолчанию (или корневой путь контекста, т.е. пустую строку в случае абсолютного виджета).

import com.tibbo.aggregate.common.script.*;

import com.tibbo.aggregate.common.widget.*;

import com.tibbo.aggregate.client.util.*;

 

public class %ScriptClassNamePattern% implements WidgetScript

{

  public Object execute(WidgetScriptExecutionEnvironment environment, Object... parameters)

  {

    ClientUtils.removeFrame(ClientUtils.createWidgetFrameKey("users.admin.widgets.test", ""));

    return null; 

  }

}

Пример 3: Открытие URL в браузере

Этот пример иллюстрирует, как открыть определенный веб-сайт в браузере. Нижеприведенный скрипт можно запустить при помощи щелчка мыши. Он принимает URL как единственный параметр.

import java.awt.*;

import java.net.*;

 

import com.tibbo.aggregate.common.widget.*;

 

public class %ScriptClassNamePattern% implements WidgetScript

{

  public Object execute(WidgetScriptExecutionEnvironment environment, Object... parameters)

  {

    try

    {

      Desktop.getDesktop().browse(new URI(parameters[0].toString()));

    }

    catch (Exception ex)

    {

      throw new IllegalStateException("Error opening url '" + parameters[0].toString() + "'", ex);

    }

     

    return null;

  }

}