Разработка библиотек кодов операций
ВНИМАНИЕ! Данная технология в настоящий момент находится на стадии разработки!
Библиотеки кодов операции являются механизмом для хранения кода, доступного агентам для вызова без необходимости использования более весомого механизма - обмена сообщениями с другими агентами. При использовании (вызове) кода операции не теряется местоположение в потоке управления исполняемого блока продукций, тогда как после обращения к другому агенту ответное сообщение инициирует работу блока продукций исходного агента с её начала, что не всегда является удобным. Отличие описываемого механизма от "коды операций над информационным ресурсом" заключается в "отвязке" кодов от инфоресурсов типа онтология, что упрощает разработчикам их поиск и хранение, позволяя операции над разнотипными инфоресурсами хранить совместно. Например, в медицине при решении задачи диагностики не придётся отдельно хранить операции обработки истории болезни от операций обработки базы знаний о заболеваниях. Кроме этого формирование библиотеки позволяет задать более качественное описание хранимых операций, чем это реализовано для кодов операций над инфоресурсом.
Цель разработки библиотеки кодов операций - сформировать библиотеку методов, реализующих операции, необходимые для решения некоторй задачи в предметной области. Набор операций хранится в информационном ресурсе типа "Структура библиотеки операций доступа к информации", их исполнение вызывается с указанием целевых инфоресурсов (в виде ссылок на их вершины) и прочих параметров.
Процесс реализации библиотеки кодов операций состоит из следующих шагов:
- создание нового информационного ресурса по метацинформации "Структура библиотеки операций доступа к информации" (расположение в Фонде: Платформа IACPaaS / Ядро платформы);
- для каждой операции - её создание или модификация следующим способом:
- задание имени операции (порождение по нетерминалу "операция", под корнем);
- задание описания операции (порождение по терминалу "описание", под именем операции);
- написание исходного кода на Java с применением API платформы - разработка класса Operations (порождение по терминалу "исходный код", под именем операции);
- формирование байткода этого класса (порождение по терминалу "байт-код", под именем операции).
После этого данные коды операций могут быть вызваны из кода блоков продукций некоторого агента (и, при необходимости, из других кодов операций).
При написании исходного кода каждой операции над информационным ресурсом необходимо использовать следующий шаблон (класс: Operations, пакет: ru.dvo.iacp.is.iacpaas.storage, файл: Operations.java):
package ru.dvo.iacp.is.iacpaas.storage;
import ru.dvo.iacp.is.iacpaas.storage.exceptions.StorageException;
@SuppressWarnings({"UnusedDeclaration"})
public class Operations
{
// DO NOT CHANGE THIS PART - START
private IInforesource ir;
private Object caller;
public Operations(IInforesource ir, Object caller)
{
this.ir = ir;
this.caller = caller;
}
// DO NOT CHANGE THIS PART - END
/** uncomment and write your operation signature and code:
* 1) replace "operationName" with your name and set its return type instead of "Object" prior to name (leave "public"!)
* 2) define types (instead of "Object") and names (instead of "param1", ...) of parameters (they may be absent)
* 3) if StorageException can occur - uncomment it
* 4) write operation codes as if in a productions block of an agent
* 5) return object of appropriate class (if needed)
*/
// public Object operationName(Object param1, Object param2, ...) // may return some POD or Fund objects or ever arrays/sets
// // throws StorageException
// {
// //place code
//
// //return value if needed
// }
}
Скачать заготовку исходного кода
При написания кода операции следует:
- снять комментарии // ;
- указать требуемый тип возвращаемого значения (вместо Object);
- задать имя операции (вместо operationName);
- перечислить требуемые параметры и их типы (вместо Object param1, ...);
- написать код (вместо …code…), используя caller для проверки доступа при вызовах методов API;
- вернуть объект требуемого класса, если это необходимо (операция не void).
Компиляция исходного кода в байт-код выполняется онлайн (в рамках редактора инфоресурса с библиотекой операций).
Для вызова и исполнения операций в блоках продукций агентов в API платформы (класс Agent) присутствует метод callLibraryOperation. То есть его вызов осуществляется напрямую из агента (this) в коде блока продукций. При вызове метода ему в параметрах необходимо передать:
- ссылку на инфоесурс библиотеки операций – объект типа IInforesource (рекомендуется для наиболее простого доступа такую библиотку назначать одним из собственных ИР решателя)
- имя операции – строка (должна совпадать с именем операции, заданным в библиотечном инфоресурсе)
- вызывающий объект - ссылка на агента (для проверок доступа к обрабатываемому ИР)
- набор параметров операции – объекты некоторых классов, согласно сигнатуре операции
Возвращаемое значение в коде агента необходимо кастовать от типа Object к требуемому типу (он должен быть упомянут в описании операции или может быть выяснен при просмотре её исходного кода).
На языке Java сигнатура метода callLibraryOperation выглядит так:
public Object callOperation(IInforesource library, String operationName, Object caller, Object params)
При исполнении этого метода платформа выполняет следующие шаги:
- переходит в инфоресурсе библиотеки операций к вершине, являющейся корнем пордграфа, описывающего операцию;
- извлекает из байткод операций;
- в случае наличия в классе Operations метода с именем, совпадающим с именем операции, - создаёт объект этого класса, вызав конструктор, после чего вызывает этот метод.