All Articles ↓
9 месяцев назад

CUBA 7.2 - что нового?

Начиная с седьмой версии CUBA Platform заметно шагнула вперед. Внутренние архитектурные улучшения и новая IDE сформировали отличный фундамент для дальнейшего развития. И мы продолжаем добавлять новые функции, помогающие разработчикам делать свою работу быстрее и проще.

В версии 7.2 есть изменения, из-за которых это обновление может казаться крупным, мажорным, но благодаря гибкости 7-ой версии это всего лишь ещё один шаг на естественном пути эволюции платформы.

CUBA - полиглот

text

В новой версии фреймворка появилась полная поддержка Kotlin. Теперь это ещё один язык для создания CUBA-приложений, наряду с Java. На Kotlin теперь можно создавать сущности, службы, контроллеры экранов и другие компоненты.

С Kotlin код становится короче и лаконичнее, что помогает создавать приложения еще быстрее. Благодаря поддержке этого языка в IDE IntelliJ IDEA мы реализовали для Kotlin ту же функциональность, что и для Java: контекстно управляемые инъекции, умные подсказки, генерация кода и т.д.

Так выглядит пример обычной сущности. Как видите, код намного короче, чем на Java, нет методов getter и setter, код понятный и прекрасно читается.

@NamePattern("%s|name")
@Table(name = "PETCLINIC_VET")
@Entity(name = "petclinic_Vet")
class Vet : StandardEntity() {
   @NotNull
   @Column(name = "NAME", nullable = false, unique = true)
   var name: String? = null

   companion object {
       private const val serialVersionUID = -8600988577624886948L
   }
}

Контроллеры экранов выглядят очень знакомо для любого, кто уже имел дело с CUBA:

@UiController("petclinic_Vet.edit")
@UiDescriptor("vet-edit.xml")
@EditedEntityContainer("vetDc")
@LoadDataBeforeShow
class VetEdit : StandardEditor<Vet>() {
   @Inject
   private lateinit var vetService: VetService

   @Subscribe("assignVisit")
   private fun onAssignVisitClick(event: Button.ClickEvent) {
       vetService.scheduleVisit(editedEntity, LocalDateTime.now());
   }
}

А вот как выглядит код интерфейса и реализации сервиса:

interface VetService {
   companion object {
       const val NAME = "petclinic_VetService"
   }
   fun scheduleVisit(vet: Vet, visitDate: LocalDateTime): Visit
}


@Service(VetService.NAME)
class VetServiceBean : VetService {
   @Inject
   private lateinit var dataManager: DataManager

   override fun scheduleVisit(vet: Vet, visitDate: LocalDateTime): Visit {
       //Business logic for a visit scheduling
   }
}

Этот код полностью совместим с Java, можно даже использовать и Kotlin, и Java в одном и том же приложении.

И, в конце-концов, Kotlin - это модно и прикольно!

Обновление подсистемы безопасности

text

Безопасность - это всегда очень важно. Мы тщательно проанализировали нашу подсистему безопасности и решили придерживаться подхода “запрещено по умолчанию”. Для тех, кто уже работал с CUBA, это может звучать странно, но девиз “лучше перебдеть, чем недобдеть” как никогда актуален в наше непростое время с утечками персональных данных. Как обычно, мы подготовили путь миграции для приложений, написанных на предыдущих версиях CUBA.

Еще одно важное изменение - задание ролей безопасности во время разработки. Теперь вы можете прописывать правила доступа в Java-коде, а значит, не нужно экспортировать определение ролей из тестовой среды и импортировать в рабочую версию. Мы не стали отменять традиционные определения ролей в среде выполнения, просто добавили еще одну функцию в подсистему безопасности. Так что вы сами решаете, как определять роли.

Вот пример с определением ролей доступа для сущностей, атрибутов и экранов:

@Role(name = "Customers Full Access")
public class CustomersFullAccessRole extends AnnotatedRoleDefinition {

    @EntityAccess(target = Customer.class,
            allow = {EntityOp.CREATE, EntityOp.READ, EntityOp.UPDATE, EntityOp.DELETE})
    @Override
    public EntityPermissionsContainer entityPermissions() {
        return super.entityPermissions();
    }

    @EntityAttributeAccess(target = Customer.class, modify = {"name", "email"})
    @Override
    public EntityAttributePermissionsContainer entityAttributePermissions() {
        return super.entityAttributePermissions();
    }

    @ScreenAccess(allow = {"application-demo", "demo_Customer.browse", "demo_Customer.edit"})
    @Override
    public ScreenPermissionsContainer screenPermissions() {
        return super.screenPermissions();
    }
}

Этот код может показаться более многословным, чем “традиционное” определение в среде выполнения, но такой подход позволяет точнее настраивать доступ к компонентам приложения. В сочетании с другими представленными нововведениями обновленная подсистема безопасности сделает ваше приложение более надежным.

Улучшенный Generic UI

Мы продолжаем поддерживать и обновлять подсистему Generic UI. В новой версии боковое меню по умолчанию свернуто, чтобы на экране приложения оставалось больше места. Это сразу видно при запуске приложения.

Что касается внутренних элементов экранов, то теперь разработчики могут определять представление для сущностей в XML-дескрипторах экранов, так что больше не нужно создавать представления в отдельном файле.

<data> 
    <instance id="orderDc" class="com.company.sales.entity.Order"> 
        <view extends="_local"> 
            <property name="lines" view="_minimal">
                <property name="product" view="_local"/>
                <property name="quantity"/>
            </property>
            <property name="customer" view="_minimal"/>
        </view>
        <loader/> 
    </instance>
</data>

Кроме того, мы добавили несколько небольших изменений, способных облегчить труд разработчика:

  • Адаптивное расположение для элементов форм
  • Предварительная сортировка таблиц
  • Команда для таблиц Select/Deselect all
  • “Быстрые клавиши” для кнопок
  • Улучшения виджета поля даты и времени
  • И другие

Упрощенное развертывание

text

Развертывание - это обычно непростая задача. В CUBA 7.2 мы постарались уменьшить количество боли и добавить новые вещи, которые способны помочь при развертывании.

В этой версии фреймворка можно конфигурировать соединения с базами данных напрямую в приложении. Вместо JNDI можно определять настройки соединения в файле app.properties.

cuba.dbmsType = hsql
cuba.dataSourceProvider = application
cuba.dataSource.username = sa
cuba.dataSource.password =
cuba.dataSource.dbName = petclinic
cuba.dataSource.host = localhost
cuba.dataSource.port = 9010

Эта функция делает приложение независимым от того, какие настройки есть на сервере приложений. И эта функциональность становится ещё интереснее в сочетании с профилями Spring - еще одним нововведением версии 7.2.

Профили Spring позволяют определять, разные бины для разных сред развертывания. Например, у вас могут быть разные реализации для серверов разработки, тестов и продакшена.

public interface HelloService {
    String NAME = "demo_helloService";

    String hello(String input);
}

@Service(HelloService.NAME)
@Profile("dev")
public class HelloDevServiceBean implements HelloService {
    @Override
    public String hello(String input) {
        return "Development stub: hello " + input;
    }
}

@Service(HelloService.NAME)
@Profile("prod")
public class HelloProdServiceBean implements HelloService {
    @Override
    public String hello(String input) {
        return "Production service: hello " + input;
    }
}

Профиль можно активировать в файле web.xml или настроив свойство среды spring.profiles.active через командную строку:

java -Dspring.profiles.active=prod -jar app.jar

Профили Spring применяются не только к бинам, но и к конфигурационным файлам. Например, вы можете определить настройки соединения для коннекта к базе в разных файлах с именами <profile>-app.properties. Или назначить разные SMTP серверы для тестовой и рабочей среды. Скажите “нет” тестовым письмам в почте клиента!

Обновление CUBA Studio

Все описанные выше возможности поддерживаются в CUBA Studio. Наш основной инструмент разработки тоже постоянно находится в процессе усовершенствования. Мы добавляем новые возможности, используем новые API IntelliJ, улучшаем алгоритмы кодогенерации, стараясь автоматизировать все, что может быть автоматизировано, чтобы избавить вас от написания повторяющегося шаблонного кода.

text

Полный список изменений можно прочитать здесь, перечислим самые важные из них:

  • Новый шаблон экрана логина. Теперь вид окна логина можно сделать более брендированным.
  • Переработан UI дизайнера экранов, панели разделены, чтобы сэкономить пространство окна IDE, и разработчикам видно изменения при редактирования XML-разметки.
  • Мастер проектов (Project Wizard) расширен, теперь он поддерживает новые языки программирования и позволяет вносить дополнительную информацию, такую как локаль и настройки главного хранилища данных.

Заключение

Это обновление позволяет разрабатывать на CUBA проще, быстрее и приятнее. А поддержка Kotlin - это возможность работать с одним из самых новых и подающих надежды языков программирования.

Развертывание в разных средах стало проще благодаря профилям Spring и конфигурации источников данных прямо в приложении.

Улучшения Generic UI помогут воплощать в реальность самые смелые дизайнерские фантазии об идеальном интерфейсе с большей точностью.

К тому же, платформа по-прежнему поддерживает обратную совместимость, так что обновление приложение до версии 7.2 должно пройти максимально беспроблемно.

С полным списком изменений и нововведений можно ознакомиться здесь.

Андрей Беляев