1.1.3. Набор данных Groovy

Groovy - набор данных формируется выполнением Groovy-скрипта. Скрипт должен возвращать объект типа List<Map<String, Object>>. Элемент этого списка, то есть объект типа Map<String, Object> соответствует одной записи набора данных.

В скрипт передаются следующие объекты:

  • dataManager - объект типа com.haulmont.cuba.core.global.DataManager, предоставляющий CRUD-функциональность для работы с персистентными хранилищами данных. Например:

    LoadContext<Book> loadContext = LoadContext.create(Book.class)
            .setId(bookId)
            .setView("book.edit")
    def book = dataManager.load(loadContext)
  • metadata - объект типа com.haulmont.cuba.core.global.Metadata, позволяющий обращаться к метаданным приложения, например:

    def metaClass = metadata.getClassNN('sec$User')
  • params - мэп внешних параметров отчета. Пример получения значения параметра:

    def active = params['active']
  • parentBand - родительская полоса в виде объекта типа com.haulmont.yarg.structure.BandData. Через этот объект методом getParameterValue() можно получить значение поля родительской полосы, например:

    def groupId = parentBand.getParameterValue('groupId')
  • persistence - объект типа com.haulmont.cuba.core.Persistence, позволяющий управлять транзакциями и получать ссылку на EntityManager. Например:

    def tx = persistence.createTransaction()
    try {
        def em = persistence.getEntityManager()
        def query = em.createQuery('select g from sec$Group g')
    ...
        tx.commit()
    } finally {
        tx.end()
    }

    Для работы с дополнительным хранилищем данных, его имя нужно указать в параметре методов createTransaction() и getEntityManager(). По умолчанию используется основная база данных.

    def tx = persistence.createTransaction('myStore')
    try {
        def em = persistence.getEntityManager('myStore')
    ...
        tx.commit()
    } finally {
        tx.end()
    }
  • security - объект типа com.haulmont.cuba.core.global.Security, используемый для проверки прав пользователя на доступ к различным объектам системы. Пример использования:

    if (security.isEntityOpPermitted(Book.class, EntityOp.READ) {
        ...
    }
  • timeSource - объект типа com.haulmont.cuba.core.global.TimeSource, используемый для получения текущего времени, например:

    def currentDate = timeSource.currentTimestamp()
  • transactional - метод, принимающий на вход замыкание, которое нужно выполнить в новой транзакции. Параметром замыкания становится текущий EntityManager. Пример использования:

    transactional { em ->
        def query = em.createQuery('select g from sec$Group g')
        ...
    }

    Пример Groovy-скрипта извлечения пользователей по группе, выводимой в родительской полосе и по внешнему параметру active:

    def result = []
    transactional { em ->
        def query = em.createQuery('select u from sec$User u where u.group.id = ?1 and u.active = ?2')
        query.setParameter(1, parentBand.getParameterValue('groupId'))
        query.setParameter(2, params['active'])
        query.resultList.each { user ->
            result.add(['userLogin': user.login, 'userName': user.name])
        }
    }
    return result
  • userSession - объект типа com.haulmont.cuba.security.global.UserSession, связанный с текущим пользователем системы, например:

    def user = userSession.currentOrSubstitutedUser
  • userSessionSource - объект типа com.haulmont.cuba.core.global.UserSessionSource, используемый для получения текущей сессии пользователя. Пример использования:

    def locale = userSessionSource.locale
Tip

Для обращения к любым бинам Spring среднего слоя можно использовать статические методы класса AppBeans, например:

def myService = com.haulmont.cuba.core.global.AppBeans.get('sample_MyService')