Создаем источники объектов

Источник объектов - позволяет работать с набором доменных объектов. А именно:

  • Добавлять новый объект к набору
  • Удалять выделенные в наборе объекты
  • Изменять выделенные в наборе объекты (если в наборе выделенно несколько объектов, то при изменении значения свойства значения изменятся в каждом из выделенных объектов)
  • Задавать строку запроса которая будет использована для получения набора объектов
  • Настройка свойств объекта которые могут использоваться для фильтрации набора объектов
  • Так же к источникам объектов можно добалять слушатели и применять агрегатные функции к свойствам доменного объекта.

Создадим два источника объектов. Один для объектов класса budget.domain.MoneyOperation другой для budget.domain.OperationItem

Источники объектов настраиваются в точке конфигурации org.weda.store.ObjectSources

Создаем источник объектов operationItem

Источник объектов для объектов класса 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 (если он задан).
  • Запрос это обычный HQL (Hibernate Query Language) запрос.
  • Единственное чем он отличается от HQL запроса это метка {#}. Эта метка показывает в какое место в запросе нужно вставлять условия фильтра. Условия фильтра формируются динамически на основе значений установленных в элементах фильтра (те значения которые пользователь приложения будет устанавливать при помощи пользовательского интерфейса (web-приложения).
  • Названия свойств объекта которые могут использоваться для фильтрации будут браться из списка имен operationItem-filter (списки имен мы создали в предыдущем разделе)

Создаем источник объектов moneyOperation

Источник объектов для объектов класса 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 если требуется.