The following areas might be a source of issues when starting to use the new version Bee’s Knees 10.0, so please make yourself familiar with this section.
In this section:
Classic UI Ends
Support for the Classic UI ended with this version and users are expected to use the Unity UI. All of the Classic functionality is now fully available in Unity.
Related Migration Steps
SSO links – If you were using single sign-on with links pointing to Classic UI, change them to Unity UI.
Email templates links – If you were using links to Classic UI in your email templates, change them to Unity UI.
Bookmarks – If you have any bookmarks pointing to Classic UI, change them to Unity UI.
Custom help – If you were using Custom Help in Classic UI and created content there, transfer it elsewhere. In Unity UI, Custom Help is supported in a different form – you can add your own link to the user menu pointing users to an external page with custom help.
Conversion of Groovy Closure Type Parameters to Groovy Types
There is a formula sandbox change to increase security: a new Advanced Configuration Option filterGroovyClosureParameterType enforces conversion of Groovy closure type parameters to their respective Groovy types. It is set to true by default for newly created partitions.
Background
Before Bee’s Knees, types were not properly converted for Groovy Sandbox (such as DomainObject to Map) when used as a closure parameter.
In this example, the code works but the cor
parameter is not a Map (as it should be) but some instance of DomainObject (CompensationRecord):
def result List cors = api.find("COR", 0, 1, null, null, Filter.equal("label", "SC_basic_logic"))?.collect() cors.each {def cor -> result = cor } return result
Note that if you explicitly set the type of cor
to Map, the code will fail with an error.
Since Bees Knee's, the conversion of types in closure parameters is automatic just for LocalDateTime -> Date (which is safe in terms of backward compatibility). Other types will not be converted by default because the conversion might break the existing Groovy code; instead there will be a specific warning in logs, i.e.:
PFUN-16195 groovy closure parameter type possible conversion: source type: net.pricefx.domain.CompensationRecord, target type: java.util.LinkedHashMap, groovy method: each
If you see this kind of log message, you should consider adding an Advanced Configuration Option filterGroovyClosureParameterType=true which will enable automatic conversion for Groovy closure parameters as it should be and will also remove the log message. Then check your Groovy code for possible errors and fix them by using a proper data type, i.e. DomainObject will be converted to Map.
When filterGroovyClosureParameterType=true is not set, then:
Will not work:
cors.each {Map cor ->
Will work:
cors.each {def cor ->
cor
is an instance of some DomainObject class.
When filterGroovyClosureParameterType=true is set, then:
Both will work:
cors.each {Map cor ->
cors.each {def cor ->
But you will not be able to access the DomainObject because it was converted to a Map.