Overview

This document highlights major changes in CUBA Platform and Studio version 6.10.

Platform

Breaking Changes

  1. Due to this enhancement, build.gradle of an existing project must be changed in the part where the entities enhancing is declared. Instead of using CubaEnhancing task like this:

    task enhance(type: CubaEnhancing) {
        persistenceConfig = 'custom-persistence.xml' // optional
    }
    
    task testEnhance(type: CubaTestEnhancing) {
        persistenceConfig = 'test-persistence.xml'
    }

    use the following DSL:

    entitiesEnhancing {
        main {
            enabled = true
            persistenceConfig = 'custom-persistence.xml' // optional
        }
        test {
            enabled = true
            persistenceConfig = 'test-persistence.xml'
        }
    }

    If you are using Studio, the migration will be done automatically.

  2. While implementing the new theme, we had to refactor the standard login window. If you have extended the login window in your project, you should adapt your code to be compatible with the new base implementation. See changes and example migration for details.

  3. Due to this enhancement your code may not compile if you have created a custom DataSupplier and implemented the commit() method. In order to fix the code, change the method return type to EntitySet.

  4. REST API v1 is now disabled by default (see #1027). To enable it in your project, add the following line to the web-dispatcher-spring.xml or portal-dispatcher-spring.xml:

    <context:component-scan base-package="com.haulmont.cuba.restapi"/>
  5. If anonymous session cannot be loaded due to a database connection problem or other error, server does not start at all. See #1080.

  6. Java system properties are now cached at server startup, so if your application relies on ability to override an app property with a system property defined at runtime, you have to reset the cache using the clearSystemPropertiesCache() methods of the CachingFacadeMBean JMX beans available in the core and web modules. See #1222.

  7. Non-persistent entities are now sent to the middleware when created or updated. If you are using standard browser and editor screens for a non-persistent entity, you will get the "Access denied" exception on attempt to edit an entity displayed in the browser screen. To fix this, define a custom DataSupplier for the editor screen, for example:

    package com.company.sample.web;
    
    import com.haulmont.chile.core.model.MetaClass;
    import com.haulmont.cuba.core.entity.Entity;
    import com.haulmont.cuba.core.global.View;
    import com.haulmont.cuba.gui.data.impl.GenericDataSupplier;
    
    import javax.annotation.Nullable;
    
    public class NonPersistentDataSupplier extends GenericDataSupplier {
    
        @Override
        public <E extends Entity> E reload(E entity, View view, @Nullable MetaClass metaClass, boolean loadDynamicAttributes) {
            return entity;
        }
    }
    <window xmlns="http://schemas.haulmont.com/cuba/window.xsd"
            class="com.company.sample.web.SomeEntityEdit"
            ...
            dataSupplier="com.company.sample.web.NonPersistentDataSupplier">
        <dsContext>
        ...
  8. Since version 6.10.11 cookies which set programmatically with AppCookies are httpOnly by default. It potentially can break some client-side code accessing cookies.

Generic UI

  1. We have created a new visual theme - Hover, which can be used as is or customized in your applications. See details in the issue. Please pay attention to the breaking changes in the standard login window, explained above.

  2. Now it is possible to exclude properties from the Filter component recursively down to the object graph. See the excludeRecursively property.

Polymer UI

We replaced paper- form elements which implement Material Design with more customizable Vaadin components. By default the app imports components based on Lumo theme. In order to use Material theme change <link rel="import" href="lumo-imports.html"> to <link rel="import" href="material-imports.html"> in app-shell.html

REST API

  1. A certain service method can be marked as available without authentication even when the anonymous access to the whole REST API is disabled. See the anonymousAllowed attribute of a service configuration.

  2. Optimistic locking based on the version attribute can be enabled by the cuba.rest.optimisticLockingEnabled application property.

Charts Addon

  1. Pivot Table data can now be exported and downloaded in XLS and JSON formats using PivotTableExtension.

  2. The new ShowPivotAction allows users to quickly export data from Table, Tree, or DataGrid to a pivot table.

Full-Text Search Addon

  1. Search process and visualization of results have been changed considerably for better performance and accuracy. Now the results are checked for row-level security in batches. The search results screen has pages, which guarantees sequential loading of all available results. See #26 for details.

Reporting Addon

  1. Reports can be generated and downloaded via REST API.

  2. The new Copy button allows users to copy report templates. See #70 for details.

  3. Ports available for OpenOffice can be set in the reporting.openoffice.ports application property.

Miscellaneous

  1. Now CUBA projects can be imported as Gradle projects into Intellij IDEA, so the default Intellij IDEA Gradle plugin can be used. See above for migration guidelines and #48 and #12 for more details about the implementation.

  2. A new experimental API has been introduced in this release: EntityChangedEvent and TransactionalDataManager.

    EntityChangedEvent is a Spring’s ApplicationEvent of the middle tier which is sent when an entity instance is saved to the database. The event can be handled both inside the transaction and after its completion (using @TransactionalEventListener). The event is sent only for entities annotated with @PublishEntityChangedEvents.

    EntityChangedEvent does not contain the changed object but only its id. Also, the getOldValue(attributeName) method returns ids of references instead of objects. This is done intentionally to make the developer reload objects with required view, dynamic attributes and other parameters. This also allows us to keep the security and other logic just in one place - in the loading mechanism, and saves from potential bugs and inconsistencies.

    TransactionalDataManager mimics the DataManager interface but can join to an existing transaction. It has the following properties:

    • If there is an active transaction, TransactionalDataManager joins it, otherwise it creates and commits a transaction same as DataManager.

    • It returns entities in detached state, so no automatic saving of changes on transaction commit is performed. Lazy loading also doesn’t work, so a developer has to load entities with appropriate views.

    • No persistence context, no implicit flushes.

    • It applies row-level security, works with dynamic attributes and cross-datastore references as expected.

    Please be informed that these features are not stable yet and we can change the API and implementation in the near future. See some additional information here.

  3. Standard JPA lifecycle callbacks (@PrePersist, @PreUpdate, @PostLoad, etc.) can be used for simple changes of entity attributes before saving and after loading.

  4. The create() and getReference() methods have been added to the DataManager interface.

  5. The new @IdSequence annotation can be used to specify an existing database sequence name for generating identifiers of entities inherited from BaseLongIdEntity or BaseIntegerIdEntity.

Updated Dependencies

com.google.code.gson/gson = 2.8.5
com.haulmont.thirdparty/eclipselink = 2.6.2.cuba24
com.vaadin = 7.7.14.cuba.0
commons-codec/commons-codec = 1.11
commons-io/commons-io = 2.6
io.swagger/swagger-models = 1.5.21
org.apache.commons/commons-collections4 = 4.2
org.apache.commons/commons-compress = 1.18
org.apache.commons/commons-dbcp2 = 2.5.0
org.apache.commons/commons-lang3 = 3.7
org.apache.commons/commons-pool2 = 2.6.0
org.apache.httpcomponents/fluent-hc = 4.5.6
org.apache.httpcomponents/httpclient = 4.5.6
org.apache.httpcomponents/httpcore = 4.4.10
org.apache.httpcomponents/httpmime = 4.5.6
org.apache.tika/tika-parsers = 1.18
org.apache.tomcat/tomcat = 8.5.33
org.aspectj/aspectjrt = 1.9.1
org.aspectj/aspectjweaver = 1.9.1
org.codehaus.groovy/groovy-all = 2.4.15
org.freemarker/freemarker = 2.3.28
org.javassist/javassist = 3.23.1-GA
org.jgroups/jgroups = 3.6.16.Final
org.json/json = 20180130
org.jsoup/jsoup = 1.11.3
org.mybatis/mybatis = 3.2.8
org.mybatis/mybatis-spring = 1.2.5
org.springframework = 4.3.18.RELEASE
org.springframework.security = 4.2.7.RELEASE
org.springframework.security.oauth/spring-security-oauth2 = 2.1.2.RELEASE

Studio

Known Issues

If you use the in-place update in Studio SE on macOS, it will completely replace your application folder. If you previously added some JDBC drivers to /Applications/Cuba Studio SE.app/Contents/Resources/app/studio/lib, they will be lost and you will have to add them again.

. . .