Groovy-скрипты обновления имеют следующую структуру:
-
Основная часть, содержащая код, выполняемый до старта контекста приложения. В этой части можно использовать любые классы Java, Groovy и блока Middleware приложения, но при этом необходимо иметь в виду, что никакие бины, интерфейсы инфраструктуры и прочие объекты приложения еще не инстанциированы, и с ними работать нельзя.
Основная часть предназначена в первую очередь, как и обычные SQL-скрипты, для обновления схемы данных.
-
PostUpdate часть - набор замыканий, которые будут выполнены после завершения процесса обновления и после старта контекста приложения. Внутри этих замыканий можно оперировать любыми объектами Middleware приложения.
В этой части скрипта удобно, напимер, выполнять импорт данных, так как в ней можно использовать интерфейс Persistence и объекты модели данных.
На вход Groovy-скриптов механизм выполнения передает следующие переменные:
-
ds
- экземплярjavax.sql.DataSource
для базы данных приложения. -
log
- экземплярorg.apache.commons.logging.Log
для вывода сообщений в журнал сервера -
postUpdate
- объект, содержащий методadd(Closure closure)
для добавления замыканий, выполняющихся после старта контекста сервера.
Groovy-скрипты выполняются только механизмом запуска скриптов БД сервером.
Пример Groovy-скрипта обновления:
import com.haulmont.cuba.core.Persistence import com.haulmont.cuba.core.global.AppBeans import com.haulmont.refapp.core.entity.Colour import groovy.sql.Sql log.info('Executing actions in update phase') Sql sql = new Sql(ds) sql.execute """ alter table MY_COLOR add DESCRIPTION varchar(100); """ // Add post update action postUpdate.add({ log.info('Executing post update action using fully functioning server') def p = AppBeans.get(Persistence.class) def tr = p.createTransaction() try { def em = p.getEntityManager() Colour c = new Color() c.name = 'yellow' c.description = 'a description' em.persist(c) tr.commit() } finally { tr.end() } })