8.3
This release contains breaking changes. These are listed at the end of this page.
Server
Features
- Authorisation: add new method to provide "userName" property as part of entity field definitions for auth map consumers
- (metrics): make logging of zero values optional in logger reporter
- Added convenience function for building local file camel string
- Added get all pipelines functions to PipelineManager
- Support paginated custom reqreps
- Transactional DB sink should audit records
- Add optional classloader and cpu metrics
Fixes
- (deploy-plugin): find project jars from gradle jar task, not from version
- Consul: improve session check logic used to determine primary process demotion to avoid race conditions
- Criteria validation and compilation should handle StackOverflow errors
- DbMon search returns the expected number of records
- DbMon updateWhere fails if there is a white space in the argument
- Ensure completion handlers are only invoked when an element is processed
- Ensure completion handlers are only invoked when an element is processed
- Ensure error messages are flushed to logs on process exit
- Fix "and" operator usage in generic GPAL "auth" blocks for eventhandler and custom req/rep
- Fix Auth key concatenation for enriched auth clauses and AuthCache re-registration operation now uses correct record ids
- Fix ClientConnectionsManager initialisation
- Mon dies when system is not able to connect to CONSUL but is configured to do so
- Refactor metric report type handling in tests and factory
- Rename "authKeyWithUsername" to "authKeyWithUserName" for consistency
- Add clientHandler router config with option to close client channel if becomes full
- Allow db mon to fetch more than 500 results
- db batch polling source should accept NANO_TIMESTAMP index
- Exclude data folder from site specific folder copy
- Fix minor issues in GenesisJunit test framework
- Fix ms sql insert handling
Dependency changes
- Added constraint on jackson-dataformat-cbor to prevent classpath issues
- Revert bump com.h2database:h2 from 2.2.224 to 2.3.230 in /genesis-conventions
- Bump com.google.errorprone:error_prone_annotations from 2.28.0 to 2.29.2 in /genesis-conventions - Bump com.google.protobuf:protobuf-java from 4.27.2 to 4.27.3 in /genesis-conventions
- Bump it.unimi.dsi:fastutil from 8.1.0-min-genesis to 8.5.14 in /genesis-conventions
- Bump org.apache.activemq:artemis-jakarta-client from 2.35.0 to 2.36.0 in /genesis-conventions
- Bump org.apache.commons:commons-lang3 from 3.15.0 to 3.16.0 in /genesis-conventions
- Bump org.apache.fury:fury-core from 0.5.1 to 0.6.0 in /genesis-conventions
- Bump org.checkerframework:checker-qual from 3.45.0 to 3.46.0 in /genesis-conventions
- Bump org.gradle:test-retry-gradle-plugin from 1.5.9 to 1.5.10 in /genesis-conventions
- Bump org.jline:jline from 3.26.2 to 3.26.3 in /genesis-conventions
- Bump software.amazon.jdbc:aws-advanced-jdbc-wrapper from 2.3.7 to 2.3.8 in /genesis-conventions
- Bump testcontainersVersion from 1.20.0 to 1.20.1 in /genesis-conventions
- downgrading H2 to 2.2.224 due different behavior on GetRange operations and indices
Patch releases
8.3.3
Features
- genesis-codegen: Add flag to create compact
toString
method on entities - genesis-junit: Add support for dumpit csv and csv.gz files
- Allow lambdas for
withInput
expressions to be assigned and reused - Optimise memory usage
BackwardJoinCache
for 1-2-1 joins - Configurable update frequency and caching for Db cluster strategy
- Display current cluster node role in
mon
- Provide better bulk purge support
Performance improvements
- genesis-environment: Use
deleteAll
inPurgerScript.purgeDerivedRange
Fixes
- genesis-pal-dataserver: Handle multiple updates for same record in data server
- Add sync backwards join cache impl
- Ensure
TRACE
level is set correctly forGenesisMessageEncoder
andGenesisMessageDecoder
whenDATADUMP_ON
is activated - Ensure cookie based
REFRESH_AUTH_TOKEN
value is correctly added toEVENT_LOGIN_AUTH
payload - ResourceDaemon doesn't properly evaluate
ClusterMode
- Cluster manager not bound when running
GenesisRun
and other scripts that userServiceModule
- Ensure
DataDumpManager
uses different loggers forGenesisMessageDecoder
andGenesisMessageEncoder
- Generated rx repos use modified fields for modify operations
- Increase zero mq subscriber worker high water mark value to Integer.max_value
- Race condition when processing multiple back join table modifications on different fields at the same time
- Regression on view generation when empty blocks are used in derived fields
- Reusable lambdas in views now cope with aliased table arguments
8.3.2
- Include dependant scripts in codegen cache key
- Table removal + table rename to the table name of the removed table now works as expected
- ResourceDaemon: Fix Dependency Injection initialisation on startup
- SysDefOverwrite test annotation overwrites specified properties with others retrieved from system definition files
- Fail preCompileScripts gradle task by default and add option to disable failing on error
- Remove explicit toString call on
ClusterMessage
debug line - Revert resolving sys def from genesis home in
TestSystemDefinitionService
8.3.1
- Deploy zip task reference correct file when product name set in settings plugin
- Dataserver
backwardsJoin
view does not recover in case of a buffered out of order update - When using
@SysDefOverwrite
annotation in tests and scripts use sys def receiver
Client
Features
- Adding label placement option
- Allow crud buttons to be placed above the grid
- Using color channels splitting raise intent
- ReqRep support when SSRM + new filters + complete overhaul
- Add playwright-bdd to foundation-testing + README update
- Default filter for combobox renderer
- Ability to add nav items in side-bar
Fixes
- Address error loop when used within foundation-layout
- Updating @playwright/test to latest
- Restore log level support on package loggers
- Display toast on crud operations
- Handle spacebar selection/deselection and update CRUD buttons
- Update server-side reqRep to match latest GSF
- Mock JSDOM dialog methods
- Search-bar value/label mapping
- Convert initial label to string
- Include additionalErrors in main errors array in smart-forms
Noteworthy changes
New injector for Google Guice
A new class has been created to address an issue following a bugfix introduced in 8.3.0, 8.2.5 and 8.1.9.
If your application is injecting the Google Guice com.google.inject.Injector
within the constructor, and no other classes belonging to the <package>
definition in the -processes.xml file are injected alongside it, the Injector might not be able to provide the right dependencies. This causes runtime exceptions on process startup.
In order to fix this issue, inject the new global.genesis.commons.guice.GenesisInjector
class instead of the Google Injector instance. This ensures the correct behaviour in every scenario.
/**
This will FAIL as the injector is the only thing being injected.
**/
@Module
class MyModule @Inject constructor(private val injector: Injector) {
}
/**
This will FAIL as the injector as only core classes are being injected alongside the injector
**/
@Module
class MyModule @Inject constructor(
private val injector: Injector,
private val entityDb: AsyncEntityDb
) {
}
/**
This will succeed as service classes are also being injected.
However, we recommend not injecting the injector at all, but if you absolutely must,
inject GenesisInjector instead, just in case somebody removes the contructor argument later.
**/
@Module
class MyModule @Inject constructor(
private val injector: Injector,
private val myClass: MyOtherClass
) {
}
Breaking changes
- Ensure full service initialisation does not happen until a service is allowed to go up when in primary mode
- Ensure dataserver doesn't go into error state when string index fields are truncated or when rows are ignored
- Increasing object_key field size
Deprecations
The sample auth
DSL syntax approaches to define auth fields shown below are now deprecated and will be removed in a future release.
Implicit field lists, and fields
in traditional dataservers and req/reps:
auth("COUNTERPARTY") {
~~COUNTERPARTY.COUNTERPARTY_ID~~
}
auth("COUNTERPARTY") {
~~**fields** {
COUNTERPARTY_ID
}~~
}
enrichedAuth("COUNTERPARTY", USER_COUNTERPARTY_DETAILS){
~~COUNTERPARTY.COUNTERPARTY_ID
USER_COUNTERPARTY_DETAILS.USER_NAME~~
}
field
and fields
in custom req/reps, event handler, and web handlers:
eventHandler<Trade>(name = "TRADE_INSERT") {
permissioning {
auth("COUNTERPARTY"){
~~field {
counterpartyId
}~~
}
}
....
}
eventHandler<Trade>(name = "TRADE_INSERT") {
permissioning {
auth("COUNTERPARTY"){
~~fields {
listOf(counterpartyId, accountId)
}~~
}
}
....
}
endpoint(GET, "all-counterparty") {
permissioning {
requestAuth("COUNTERPARTY") {
~~field {
counterpartyId
}~~
}
responseAuth("COUNTERPARTY") {
~~fields {
listOf(counterpartyId)
}~~
}
}
handleRequest {
db.getBulk(COUNTERPARTY)
}
}
requestReply<CounterpartyId, Counterparty>("COUNTERPARTY") {
permissioning {
~~field {
counterparty
}~~
}
}
requestReply<CounterpartyId, Counterparty>("COUNTERPARTY") {
permissioning {
~~fields {
listOf(counterparty)
}~~
}
}
The new syntax to be used is universal and consistent for all GPAL scripts. See sample below:
auth("COUNTERPARTY"){
authKey {
key(data.counterpartyId)
}
}