Источник объектов - позволяет работать с набором доменных объектов. А именно:
Создадим два источника объектов. Один для объектов класса
budget.domain.MoneyOperation другой для
budget.domain.OperationItem
Источники объектов настраиваются в точке конфигурации
org.weda.store.ObjectSources
Источник объектов для объектов класса budget.domain.OperationItem
будет выглядеть следующим образом:
<contribution configuration-id="org.weda.store.ObjectSources">
<objectSource
name="operationItem" baseClass="domain.OperationItem"
baseClassPosition="0" baseClassAlias="operationItem"
>
<query maxRows="100" fetchSize="50" timeout="60">
from budget.domain.OperationItem as operationItem
where 1=1
{#}
order by operationItem.itemName
</query>
<filter namesList="operationItem-filter"/>
</objectSource>
</contribution>
Обратим внимание на следующие моменты:
baseClass
имеет не полное имя (его полное имя budeget.domain.OperationItem)
Микроядро HiveMind
само достраивает полный путь до класса основываясь на значении
атрибута id элемента module или
значении атрибута package (если он задан).
{#}.
Эта метка показывает в какое место в запросе нужно вставлять
условия фильтра. Условия фильтра формируются динамически
на основе значений установленных в элементах фильтра (те значения
которые пользователь приложения будет устанавливать
при помощи пользовательского интерфейса (web-приложения).
operationItem-filter
(списки имен мы создали в предыдущем разделе)
Источник объектов для объектов класса budget.domain.MoneyOperation
будет выглядеть следующим образом:
<objectSource
name="moneyOperation" baseClass="domain.MoneyOperation"
baseClassPosition="0" baseClassAlias="money"
>
<query maxRows="100" fetchSize="50" timeout="60">
from budget.domain.MoneyOperation as money
where 1=1
{#}
order by money.operationDate desc
</query>
<filter namesList="moneyOperation-filter"/>
<summary>
<element property="amount" function="sum"/>
</summary>
<listeners>
<listener object="instance:listeners.MoneyOperationObjectSourceListener"/>
</listeners>
</objectSource>
Обратим внимание на следующие моменты:
summary мы заставляем источник объектов
подсчитать сумму по значению свойства amount.
listeners мы регистрируем слушатель
который мы создадим далее в этом разделе.
Слушатель нам будет необходим для того чтобы делать отрицательной сумму дебетовой операции и положительной сумму кредитовой операции.
Для создания слушателя создайте java пакет budget.listeners
и добавте к нему следующий класс
MoneyOperationObjectSourceListener.java
Код слушателя достаточно прозрачен. С помощью event.getChangeType()
узнаем тип события, произошедшего в источнике объектов
(на интересует изменение и добавление объектов к источнику объектов).
Далее "бежим" по тем объектам которые изменились и изменяем
значение свойства amount если требуется.