Сервис на тестовый решатель <<< Платформа IACPaaS / Ядро платформы / Структура сервиса
{
решатель {
Структура решателя [ -> Тестовый решатель$ ; ]
}
входные инфоресурсы {
инфоресурс [ -> Входной ресурс - исходное число$; ]
}
выходные инфоресурсы {
инфоресурс [ -> Выходной ресурс - результирующее число$; ]
}
папка по умолчанию ["Тесты/МАС"]
}Тестовый решатель <<< Платформа IACPaaS / Ядро платформы / Структура решателя
{
корневой агент {
Структура агента [ -> ТестКорнАгент$ ; ]
}
входные инфоресурсы {
инфоресурс [ -> Мета - одно число$; ]
}
выходные инфоресурсы {
инфоресурс [ -> Мета - одно число$; ]
}
собственные инфоресурсы {
инфоресурс [ -> Собств - много чисел$; ]
}
собственные инфоресурсы на чтение {
инфоресурс [ -> Собств - одно число$; ]
}
временные инфоресурсы {
инфоресурс [ -> Мета - одно число$; ]
}
}Мета - одно число
{
~one a [int]
}
Входной ресурс - исходное число <<< Мета - одно число
{
a [1]
}
Выходной ресурс - результирующее число <<< Мета - одно число
{
#данные в исходное состояние инфоресурса не заносятся - число будет записано агентом
}Тестовая предметная область / Тесты / МетаВыходРесурс {
~one res [int]
}
Тестовая предметная область / Тесты / Выходной ресурс1 <<< Тестовая предметная область / Тесты / МетаВыходРесурс {
res [0]
}Тестовая предметная область / Тесты / ТестКорнАгент <<< Платформа IACPaaS / Ядро платформы / Структура агента {
внутреннее имя ["TestRootAgent"]
описание ["Корневой агент тестового решателя"]
множество продукций {
блок продукций [1] {
описание ["Обработка иниц. сообщения - посылка сообщения с заданием агенту шифровальщику"]
шаблон входного сообщения {
Структура шаблона сообщения [ -> Платформа IACPaaS / Ядро платформы / Шаблон Инициализирующее сообщение<math>; ]
}
шаблоны выходных сообщений {
Структура шаблона сообщения [ -> Тестовая предметная область / Тесты / Шаблон Задание</math>; ]
}
}
блок продукций [2] {
описание ["Обработка сообщения c шифровкой - сохранение результата и посылка финализирующего сообщения"]
шаблон входного сообщения {
Структура шаблона сообщения [ -> Тестовая предметная область / Тесты / Шаблон Шифровка<math>; ]
}
шаблоны выходных сообщений {
Структура шаблона сообщения [ -> Платформа IACPaaS / Ядро платформы / Шаблон Финализирующее сообщение</math>; ]
}
}
}
}
Тестовая предметная область / Тесты / Агент шифровальщик <<< Платформа IACPaaS / Ядро платформы / Структура агента {
внутреннее имя ["CipherAgent"]
описание ["Шифрующий агент тестового решателя"]
множество продукций {
блок продукций [1] {
описание ["Обработка сообщения с заданием и посылка сообщения с результатом обратно"]
шаблон входного сообщения {
Структура шаблона сообщения [ -> Тестовая предметная область / Тесты / Шаблон Задание<math>; ]
}
шаблоны выходных сообщений {
Структура шаблона сообщения [ -> Тестовая предметная область / Тесты / Шаблон Шифровка</math>; ]
}
}
}
}Тестовая предметная область / Тесты / Шаблон Задание <<< Платформа IACPaaS / Ядро платформы / Структура шаблона сообщения { внутреннее имя ["Task"] !{ ~list ~gen число [int] } } Тестовая предметная область / Тесты / Шаблон Шифровка <<< Платформа IACPaaS / Ядро платформы / Структура шаблона сообщения { внутреннее имя ["Cipher"] !{ ~one ~gen код [int] } }
public abstract class TestRootAgent
extends Agent
{
public TestRootAgent(IRunningService runningService, IInforesource agentInforesource)
{
super(runningService, agentInforesource);
}
// Описание продукций для диспетчера сообщений
static
{
try
{
describeProduction(
ru.dvo.iacp.is.iacpaas.mas.messages.system.InitMessage.class,
InitMessageResultCreator.class,
TestRootAgent.class);
describeProduction(
ru.dvo.iacp.is.iacpaas.mas.messages.CipherMessage.class,
CipherMessageResultCreator.class,
TestRootAgent.class);
}
catch(NoSuchMethodException ex)
{
throw new RuntimeException(ex);
}
}
/**
* Создатель результатов для блока-обработчика сообщения "Платформа IACPaaS/Ядро платформы/Шаблон Инициализирующее сообщение"
*/
public final static class InitMessageResultCreator
extends ResultCreator
{
public final TaskMessage.Creator taskMessage;
public InitMessageResultCreator(MasFacet mas, IRunningService runningService)
throws
MasException
{
super(mas, runningService);
taskMessage = new TaskMessage.Creator(this);
}
}
/**
* Создатель результатов для блока-обработчика сообщения "Тестовая ПО / Тест / Шаблон Шифровка"
*/
public static final class CipherMessageResultCreator extends ResultCreator
{
public final FinalizeMessage.Creator finalizeMessage;
public CipherMessageResultCreator(MasFacet mas, IRunningService runningService)
throws
MasException
{
super(mas, runningService);
finalizeMessage = new FinalizeMessage.Creator(this);
}
}
// Заготовки для блоков продукций
/**
* Обработка сообщения "Платформа IACPaaS / Ядро платформы / Шаблон Инициализирующее сообщение"
*
* Обработка иниц. сообщения - посылка сообщения с заданием агенту шифровальщику
*/
public void runProduction(InitMessage msg, InitMessageResultCreator rc)
throws
PlatformException
{
throw new UnsupportedOperationException(); //TODO: заменить этот код на требуемый код БП
}
/**
* Обработка сообщения "Платформа IACPaaS/Ядро платформы/Шаблон Инициализирующее сообщение"
*
* Обработка сообщения c шифровкой - сохранение результата и посылка финализирующего сообщения
*/
public void runProduction(CipherMessage msg, CipherMessageResultCreator rc)
throws
PlatformException
{
throw new UnsupportedOperationException(); //TODO: заменить этот код на требуемый код БП
}
}
public final class TestRootAgentImpl
extends TestRootAgent
{
public TestRootAgentImpl(IRunningService runningService, IInforesource agentInforesource)
{
super(runningService, agentInforesource);
}
// блоки продукций
public void runProduction(InitMessage msg, InitMessageResultCreator rc)
throws
PlatformException
{
// получаем инфоресурс с исходными данными
IInforesource inIR = runningService.getInputs()[0]; // вывод в лог решателя
info("создаём сообщение агенту шифровальщику по его адресу в фонде"); // вывод в лог решателя
TaskMessage tm = rc.taskMessage.create("Тестовая предметная область / Тесты / Агент шифровальщик");
info("наполняем сообщение для агента шифровальщика данными"); // вывод в лог решателя
tm.addNum(inIR.getRoot().getDirectSuccessorByMeta("a", this).getValue());
tm.addNum(inIR.getRoot().getDirectSuccessorByMeta("b", this).getValue());
} // по завершении обработки блока продукций сообщение встало в очередь и будет обработано
public void runProduction(CipherMessage msg, CipherMessageResultCreator rc)
throws
PlatformException
{
// получаем выходной инфоресурс
IInforesourceGenerator outIR = runningService.getOutputs()[0];
// пишем в него результат
outIR.generateFromtRoot().generateWithValue("a", msg.getRes());
info("иниц агент шлет сообщение КОНЕЦ"); // вывод в лог решателя
rc.finalizeMessage.create();
} // по завершении обработки блока продукций сообщение встало в очередь и будет обработано
}Impl".
public abstract class CipherAgent
extends Agent
{
public CipherAgent(IRunningService runningService, IInforesource agentInforesource)
{
super(runningService, agentInforesource);
}
// Описание продукций для диспетчера сообщений
static
{
try
{
describeProduction(
ru.dvo.iacp.is.iacpaas.mas.messages.TaskMessage.class,
TaskMessageResultCreator.class,
CipherAgent.class);
}
catch(NoSuchMethodException ex)
{
throw new RuntimeException(ex);
}
}
/**
* Создатель результатов для блока-обработчика сообщения "Тестовая предметная область / Тесты / Шаблон Задание"
*/
public final static class TaskMessageResultCreator
extends ResultCreator
{
public final CipherMessage.Creator cipherMessage;
public TaskMessageResultCreator(MasFacet mas, IRunningService runningService)
throws
MasException
{
super(mas, runningService);
cipherMessage= new CipherMessage.Creator(this);
}
}
// Заготовки для блоков продукций
/**
* Обработка сообщения "Тестовая предметная область / Тесты / Шаблон Задание"
*
* Обработка сообщения с заданием и посылка сообщения с результатом обратно
*/
public void runProduction(TaskMessage msg, TaskMessageResultCreator rc)
throws
PlatformException
{
throw new UnsupportedOperationException(); //TODO: заменить этот код на требуемый код БП
}
}public final class CipherAgentImpl
extends CipherAgent
{
public CipherAgentImpl(IRunningService runningService, IInforesource agentInforesource)
{
super(runningService, agentInforesource);
}
// блоки продукций
public void runProduction(TaskMessage msg, TaskMessageResultCreator rc)
throws
PlatformException
{
info("создаём сообщение агенту, приславшему задание"); // вывод в лог решателя
CipherMessage cm = rc.cipherMessage.create(rc.getSender());
info("наполняем сообщение данными"); // вывод в лог решателя
long a = msg.getNum(0);
long b = msg.getNum(1);
cm.putRes(a * b * (b - a) + 3);
} // по завершении обработки блока продукций сообщение встало в очередь и будет обработано
}Impl".
public class TaskMessage
extends Message
{
public static final Date TEMPLATE_MODIFIED_DATE = new Date(1428494236552L);
public TaskMessage(IInforesource messageInforesource, MasFacet mas)
{
super(messageInforesource, mas);
}
public static final class Creator
extends Message.Creator
{
public Creator(ResultCreator rc)
throws
MasException
{
super(rc, "Тестовая предметная область / Тесты", "Задание");
}
/**
* Создать сообщение для агента \a agentName
*/
public TaskMessage create(String agentName)
throws
MasException
{
return (TaskMessage)createInt(agentName);
}
/**
* Создать сообщение для экземпляра агента \a agent
*/
public TaskMessage create(AgentPtr agent)
throws
MasException
{
return new TaskMessage(createInt(agent).getInforesource(), mas);
}
}
// методы, добавленные лично разработчиком шаблона
// записать число в сообщение
public void addNum(long num)
throws
PlatformException
{
// через вызов msgGen() получаем возможность читать и порождать в инфоресурсе сообщения
msgGen().generateWithValue("число", num);
}
// получить число из сообщения (по порядковому номеру, начиная с 0)
public long getNum(int address)
throws
PlatformException
{
return msgGen().getSetByMeta("число")[address].getValue();
}
}public class CipherMessage
extends Message
{
public static final Date TEMPLATE_MODIFIED_DATE = new Date(1428494236553L);
public CipherMessage(IInforesource messageInforesource, MasFacet mas)
{
super(messageInforesource, mas);
}
public static final class Creator
extends Message.Creator
{
public Creator(ResultCreator rc)
throws
MasException
{
super(rc, "Тестовая предметная область / Тесты", "Шифровка");
}
/**
* Создать сообщение для агента \a agentName
*/
public CipherMessage create(String agentName)
throws
MasException
{
return (CipherMessage)createInt(agentName);
}
/**
* Создать сообщение для экземпляра агента \a agent
*/
public CipherMessage create(AgentPtr agent)
throws
MasException
{
return new CipherMessage(createInt(agent).getInforesource(), mas);
}
}
// методы, добавленные лично разработчиком шаблона
// записать число в сообщение
public void putRes(long res)
throws
PlatformException
{
// через вызов msgGen() получаем возможность порождать в инфоресурсе сообщения
IConcept resConc = msgGen().getDirectSuccessorByMeta("res", this)
if (resConc != null)
resConc.getEditor(this).setValue(res);
else
msgGen().generateWithValue("res", res);
}
// получить число из сообщения
public long getRes()
throws
PlatformException
{
return msgGen().getDirectSuccessorByMeta("res", this).getValue();
}
}