Источник объектов - позволяет работать с набором доменных объектов. А именно:
Создадим два источника объектов. Один для объектов класса
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
если требуется.