Plugins
Genesis Gradle Settings Plugin
The Genesis Gradle Settings plugin provides the following benefits:
- Centralised Genesis project configuration.
- Massive reduction in the number of lines of code in your Gradle files.
- Consistent configuration. For example, you won't need to remember to add a dictionary dependency - the Settings plugin will add it for you.
- Simplified development experience with the IntelliJ plugin.
This section explores the features of the Settings plugin for both structures.
How to enable?
All modern projects should have this enabled bty default.
To manually enable, add the following to your "server" project's settings.gradle.kts file.
pluginManagement {
val genesisVersion: String by settings
plugins {
id("global.genesis.settings") version genesisVersion
}
}
plugins {
id("global.genesis.settings")
}
Common configuration
Once the Settings plugin has been applied, the genesis extension will be available in your project's settings.gradle.kts file.
genesis {
}
There are a few common configuration options, they are listed below:
projectType
There are two project types:
- APPLICATION is the default, and should be used at all other times.
- PBC (Packaged Business Capability). Set this when the project contains reusable code and functionality that will be imported by other projects.
The differences between the two are:
- When the project type is APPLICATION, a site-specific distribution is created in addition to the project's one.
- When the project type is PBC, by default, the project's dictionary cache sub-modules have publishing tasks disabled. If you want to enable publishing, then disable the
genesisPublicationDisablerplugin (see here for details). Projects with type APPLICATION will have publishing enabled for these modules.
genesis {
projectType = APPLICATION
}
productName
By default, the product name is taken from the server Gradle project's rootProject name in the settings.gradle.kts file. You can use this property to specify a custom project name.
Example usage:
genesis {
productName = "position"
}
mainModuleName
By default, the main module is identified by a module ending with -app
You can also set a custom name for your main module with the property mainModuleName. For example, this sets the main module name to "position-core":
genesis {
mainModuleName = "position-core"
productName = "position"
}
When using this property, the productName property must also be specified.
dependencies
Here you should declare any dependencies on other Genesis products; this enables the Settings plugin to take care of where they should be added automatically.
Fo all the dependencies that you declare, the Settings plugin will:
- import the product's dictionary, so that the tables and views are available within your project
- capture runtime details of the product's processes, making them available to run through the Intellij plugin
- register GPAL script definitions, to help Intellij recognize these files correctly
The syntax is similar to Gradle dependencies - but not exactly the same. Specifically, you specify the group id, product name and version: "{groupId}:{productName}:{version}"
Here is an example of adding a dependency on Auth and Genesis Notify:
genesis {
dependencies {
dependency("global.genesis:auth:${extra.properties["authVersion"]}")
dependency("global.genesis:genesis-notify:${extra.properties["notifyVersion"]}")
}
}
plugins
Other Gradle plugins that are necessary for your project are automatically added by the Settings plugin. Below you can see the plugins that are added. These plugins can also be disabled if needed.
| Plugin Name | Plugin ID | Description | Enabled by default |
|---|---|---|---|
| Kotlin | org.jetbrains.kotlin.jvm | Kotlin Gradle plugin | Yes |
| Genesis Build | global.genesis.build | Core Genesis plugin to enable build tasks, including code generation | Yes |
| Genesis Distribution | global.genesis.distribution | Creates the project's server distribution zip file. presently, this is based on the default configuration within the plugin. If you want to customize your distribution then you will need to disable this plugin and create your own configuration using the Gradle distribution plugin. In the future we will support customization from this plugin directly. | Yes |
| Genesis Site Specific Distribution | global.genesis.site-specific.distribution | Creates the site-specific distribution zip file. Presently, this is based on the default configuration within the plugin, the same as the Genesis Distribution plugin. | Yes, if project type is APPLICATION |
| Genesis Publication Disabler | global.genesis.publication-disabler | Used to disable dictionary-cache sub-module publishing tasks if the project is of type PBC | Yes, if project type is PBC |
| Genesis Exec | global.genesis.exec | Creates Gradle tasks used by the Genesis IntelliJ plugin and Genesis Start. Applied to the main module. | Yes |
| Genesis Deploy | global.genesis.deploy | Creates deployment gradle tasks (Note: not required if using Genesis IntelliJ plugin for local development) | No |
Here is an example of disabling the Genesis Deploy plugin:
genesis {
plugins {
genesisDeploy.enabled = false
}
}
Other features
The Settings plugin also provides some helper functions to make it simpler to add Genesis dependencies to your project.
Dependency on generated code
To add a dependency on your project's generated code in one of your project's modules, include the following in the module's build.gradle.kts file:
dependencies {
genesisGeneratedCode(withTestDependency = true)
}
The parameter withTestDependency is an optional parameter; it adds your generated code as a test dependency. It defaults to false.
For example, if your project is named "position", this is equivalent to:
compileOnly(project(path = ":position-dictionary-cache", configuration = "codeGen"))
testImplementation(project(path = ":position-dictionary-cache", configuration = "codeGen"))
Genesis dependency
The Settings plugin automatically adds a Gradle platform dependency on the Genesis BOM and has some syntax sugar for adding dependencies on other Genesis modules. For example, if you want to add a dependency on genesis-eventhandler in a module’s build.gradle.kts file, include the following:
dependencies {
dependency(genesis("eventhandler"))
}
Gradle Configuration Cache
Genesis Gradle plugins are compatible with the Gradle configuration cache, which is enabled by default in the new project seed. This can greatly improve build times.
Exec Plugin
The Exec plugin is key to running a Genesis application locally with either the Genesis IntelliJ plugin or Genesis Start. It is enabled by default and applied to the main module of the project.
Configuration
The Exec plugin has a Gradle extension to customise its configuration.
Open Telemetry
You can enable running your Genesis application processes locally with Open Telemetry. You can also provide extra JVM options which may be useful due to the many configuration options that can be provided to the Open Telemetry agent.
Example:
genesisExec {
openTelemetry {
enabled = true // false by default
extraOptions = "-Dotel.traces.exporter=zipkin" // null by default
serviceNameEnabled = true // true by default
}
}
Genesis Build Plugin
The Genesis Build plugin (global.genesis.build) is a core Gradle plugin that provides essential build automation and configuration for Genesis applications. It is automatically applied by the Genesis Gradle Settings plugin and handles critical build tasks including dependency management, manifest generation, code generation integration, and security checks.
Some of its key features are:
- Automatically configuring build tasks for all project modules
- Managing runtime dependencies for distribution packaging
- Generating JAR manifest files with classpath and implementation details
- Integrating code generation for dictionary cache modules
- Enforcing security best practices through automated permission checks
- Providing IntelliJ IDE integration tasks for local development
Automatic Module Configuration
The plugin automatically configures all subprojects in your Genesis application:
-
copyDependenciestask: Creates acopyDependenciestask for application modules to collect runtime dependencies needed for distribution packaging. This task copies all runtime classpath dependencies to a central location in the build directory. -
checkAuthPermissionstask: Creates acheckAuthPermissionstask to analyze the genesis application code to verify the endpoints have appropriate security configurations. -
JAR Manifest Generation: Automatically configures JAR tasks to include manifest attributes:
Class-Path: Lists all runtime dependenciesImplementation-Vendor: Project group IDImplementation-Title: Project nameImplementation-Version: Project version
-
Dictionary Cache Integration: Automatically applies the
DictionaryCachePluginto modules ending with-dictionary-cache, enabling code generation for system definitions, fields, DAOs, and views. -
Product Details Creation: Applies the
ProductDetailsCreatorPluginto the distribution project to generate product metadata.
IntelliJ Integration
To enable IntelliJ integration tasks, set the following property in your gradle.properties:
enableGenesisIntellijHelperTasks=true
When the enableGenesisIntellijHelperTasks property is set, the plugin creates deployment tasks that integrate with the Genesis IntelliJ plugin:
- deployModuleJarsToGenesisHome: Deploys compiled JAR files to
.genesis-home/{productName}/bin/ - deployScriptsToGenesisHome: Deploys GPAL scripts from
-script-configmodules to.genesis-home/{productName}/scripts/ - deployCfgToGenesisHome: Deploys configuration files from
-configmodules to.genesis-home/{productName}/cfg/ - deployDaoToGenesisHome: Deploys generated DAO artifacts from dictionary cache modules to
.genesis-home/{productName}/bin/
All IntelliJ helper tasks are grouped under the genesis-intellij task group for easy discovery in the IDE.
Module Filtering
The following module types won't be applied to the copyDependencies and checkAuthPermissions tasks:
- Modules ending with
-dictionary-cache - Modules ending with
-distribution - Modules ending with
-deploy - Modules containing
-generated-in their name
checkAuthPermissions
The checkAuthPermissions task (available from version 8.14.8 onwards) automatically analyzes your Genesis application code to verify that endpoints have appropriate security configurations. It scans GPAL (Genesis Platform Abstraction Layer) DSL files, Kotlin classes, and Java classes to ensure that endpoints implement proper permission checks and authentication mechanisms.
The task is automatically registered for all application modules (excluding platform and generated code) by the GenesisBuildPlugin. It runs as part of the assemble and build tasks when enabled.
Security Model
The task enforces a two-check security model:
-
Permission Check: Verifies that endpoints have permission code validation
- GPAL/KTS endpoints: Requires
permissionCodes,customPermissions, orpermissionCodesDisabled() - Class-based endpoints: Requires
RightSummaryCacheinjection/usage
- GPAL/KTS endpoints: Requires
-
Auth Check: Verifies that endpoints have authentication/authorization map configuration
- GPAL/KTS endpoints: Requires
auth(),requestAuth(), orresponseAuth()blocks orauthDisabled() - Class-based endpoints: Requires
AuthCacheFactoryinjection/usage
- GPAL/KTS endpoints: Requires
An endpoint is considered secure if both checks are satisfied or explicitly disabled via annotations or opt-out properties.
Supported Endpoint Types
GPAL/KTS Files
The task analyzes the following GPAL file types:
*-dataserver.kts- Dataserver endpoints*-reqrep.kts- Request-reply endpoints*-eventhandler.kts- Event handler endpoints*-web-handler.kts- Web handler endpoints.ktfiles containing GPAL class definitions (e.g.,GPalDataserver,GPalRequestServer,GPalEventHandler)
GPAL Analysis Features:
-
Endpoint Detection: Identifies endpoints via DSL functions:
query()- Dataserver endpointsrequestReply()- Request-reply endpointseventHandler()- Event handler endpointsendpoint()/multipartEndpoint()- Web handler endpoints
-
Permission Code Detection: Extracts permission codes from:
permissionCodes("CODE1", "CODE2")- Function call syntaxpermissionCodes = listOf("CODE1", "CODE2")- Assignment syntax- Global permission codes (defined at file or class level)
customPermissions { }blockspermissionCodesDisabled()- Explicit opt-out
-
Auth Block Detection: Identifies authentication blocks:
auth("MAP_NAME") { }- Standard auth blockrequestAuth("MAP_NAME") { }- Request auth for web handlersresponseAuth("MAP_NAME", flow) { }- Response auth for web handlersauthDisabled()- Explicit opt-out
-
Global Permissioning: Supports global permission configuration:
- File-level permission codes (for KTS files)
- Class-level permission codes (for
.ktfiles with GPAL classes) - Global
permissionCodesDisabled()andauthDisabled()functions
-
Annotation Support:
@AuthDisabled- Disables auth requirement (file or class level)@PermissionCodesDisabled- Disables permission code requirement (file or class level)
Kotlin Class Files
The task analyzes Kotlin classes that implement event handlers or web endpoints.
Supported Event Handler Types:
AsyncEventHandler<T>AsyncValidatingEventHandler<T>AsyncContextValidatingEventHandler<T>SyncEventHandler<T, R>SyncValidatingEventHandler<T, R>SyncContextValidatingEventHandler<T, R>AbstractEventHandler(legacy)Rx3EventHandler<T, R>Rx3ValidatingEventHandler<T, R>Rx3ContextValidatingEventHandler<T, R>
Supported Web Endpoint Types:
WebEndpointBaseWebEndpointBodyLessWebEndpointAbstractAsyncEndpoint
Kotlin Analysis Features:
-
Security Detection: Checks for:
RightSummaryCacheinjection (constructor, field, or parameter)AuthCacheFactoryinjection (constructor, field, or parameter)
-
Permission Code Extraction: Extracts permission codes from method calls:
rightSummaryCache.userHasRight(userName, "PERMISSION_CODE") -
Auth Map Extraction: Extracts auth map names from method calls:
authCacheFactory.newReader("MAP_NAME") -
Endpoint Name Resolution: Derives endpoint names from:
name()method override (for web endpoints)messageType()method override (for event handlers)- Generic type parameters (for typed event handlers)
- Constructor parameters (for
AbstractEventHandler)
Java Class Files
The task analyzes Java classes using JavaParser, with similar capabilities to Kotlin analysis.
Supported Types:
- Same event handler interfaces as Kotlin (except async variants)
- Same web endpoint interfaces as Kotlin (except async variants)
Java Analysis Features:
-
Security Detection: Checks for
RightSummaryCacheandAuthCacheFactoryin:- Fields
- Constructor parameters
- Method parameters
- Method body usage
-
Permission Code Extraction: Extracts from:
rightSummaryCache.userHasRight(userName, "PERMISSION_CODE"); -
Auth Map Extraction: Extracts from:
authCacheFactory.newReader("MAP_NAME"); -
Endpoint Name Resolution: Similar to Kotlin, with Java-specific parsing
Configuration
The task behavior can be configured using Gradle properties in your gradle.properties file:
| Property | Default | Description |
|---|---|---|
genesis.check.permission.enabled | true (from 8.15 onwards, false otherwise) | Controls whether the task runs as part of the build process |
genesis.check.permission.failbuild | false | When true, the build will fail if any insecure endpoints are found |
genesis.check.permission.systemwide.optout | false | System-wide opt-out that bypasses all security checks |
genesis.check.permission.auth.optout | false | Opts out of the authentication/authorization map requirement |
genesis.check.permission.extrainfo | false | When true, the CSV report includes additional detailed columns |
Example configuration:
genesis.check.permission.enabled=true
genesis.check.permission.failbuild=true
genesis.check.permission.extrainfo=false
Source Directories and Customization
By default, the task scans: src/main/kotlin, src/main/java, src/main/resources/, src/main/resources/scripts, and src/main/genesis/scripts.
You can customize the source directories in your module's build.gradle.kts:
tasks.named<global.genesis.gradle.plugin.security.CheckAuthPermissions>("checkAuthPermissions") {
sourceDirectories.set(
files(
"src/main/kotlin",
"src/main/java",
"src/main/genesis/scripts"
)
)
}
Opt-Out Mechanisms
Security checks can be disabled via:
- Annotations (file or class level):
@AuthDisabled(import global.genesis.commons.annotation.AuthDisabled),@PermissionCodesDisabled(import global.genesis.commons.annotation.PermissionCodesDisabled) - DSL Functions (GPAL only):
permissionCodesDisabled(),authDisabled() - Gradle Properties:
genesis.check.permission.systemwide.optout,genesis.check.permission.auth.optout
The opt-out mechanism will mark the endpoints as "safe" rather than ignore them. Nonetheless, the endpoints will show up in the "extrainfo" report (see next section), with opt-out information included in it.
Reports
The task generates a CSV report for each module at build/reports/genesis-security/auth-permissions.csv containing endpoint name, type, file name, class name, status (SUCCESS/FAILURE), and reason. When genesis.check.permission.extrainfo=true, additional columns include permission codes, auth maps, and security flags.
Examples
Secure GPAL Dataserver:
query("ALL_TRADES", TRADE) {
permissioning {
permissionCodes("TRADE_VIEW")
auth("COUNTERPARTY_VISIBILITY") {
authKey { key(data.counterpartyId) }
}
}
}
Secure Kotlin Event Handler:
@AuthDisabled
class TradeInsertEventHandler @Inject constructor(
private val rightSummaryCache: RightSummaryCache,
) : AsyncEventHandler<Trade, EventReply> {
override fun messageType() = "TRADE_INSERT"
override suspend fun process(event: Event<Trade>): EventReply {
if (!rightSummaryCache.userHasRight(event.userName, "TRADE_INSERT")) {
return nack("Insufficient permissions")
}
return ack()
}
}
Full Opt-Out Example:
@AuthDisabled
@PermissionCodesDisabled
class InstrumentEndpoint : AbstractAsyncEndpoint("instrument") {
// No security required
}
Execution
Run the task manually:
./gradlew checkAuthPermissions
The task runs automatically during assemble and build when enabled. To skip it, use ./gradlew build -x checkAuthPermissions or set genesis.check.permission.enabled=false in gradle.properties.
Troubleshooting
- Task not running: Verify
genesis.check.permission.enabled=trueand that your module is not excluded - False positives: Use
genesis.check.permission.extrainfo=truefor detailed information, verify annotations are correctly applied, and ensureRightSummaryCache/AuthCacheFactoryare injected (not just referenced) - Build failures: Review the CSV report, fix insecure endpoints or add opt-outs, or temporarily disable with
genesis.check.permission.failbuild=false
The task is cacheable, and parallel-safe. For CI/CD, recommended configuration includes genesis.check.permission.enabled=true, genesis.check.permission.failbuild=true, and genesis.check.permission.extrainfo=false.
Configuration
Automatic Application
The Genesis Gradle Build plugin is automatically applied by the Genesis Gradle Settings plugin. You typically don't need to apply it manually.
Task Dependencies
The plugin automatically sets up task dependencies:
jartask depends oncopyDependenciesfor application modulesassembleandbuildtasks depend oncheckAuthPermissionswhen security checks are enabledcheckAuthPermissionsdepends oncompileKotlinandcompileJavato ensure source files are compiled before analysis
Distribution Integration
The plugin identifies the distribution project (a module ending with -distribution or the root project if none exists) and applies the ProductDetailsCreatorPlugin to generate product metadata required for distribution packaging.