Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.activeviam.com/llms.txt

Use this file to discover all available pages before exploring further.

This guide explains the changes required to migrate to the stated version of the .

6.0.8 to 6.0.9

Summary

SACubeRRAOExport column header rename

The SACubeRRAOExport DEE template now exports the RRAO Category column under the header RRAOCategory instead of OtherResidualRiskType. Downstream consumers that parse the export by header name must be updated from OtherResidualRiskType to RRAOCategory.

Distributed messaging API (if customized)

This section applies only if your project customizes distributed messaging classes. The IMessageHandlerRegistrar pattern introduced in 6.0.8 has been replaced. The following classes have been removed:
  • BusinessDayCalendarMessageHandler
  • FrtbCoreMessageHandlerRegistrar
  • DatastoreMetadataMessenger
BusinessDayCalendarMessage is now a Java record implementing Request (from com.activeviam.activepivot.dist.impl.avinternal.communication). Its answer is a nested record implementing Answer and ProcessedOutput. Handler registration is done inline using the CommunicationRegistration fluent API instead of the @AtotiExtendedPluginValue annotation. Before (6.0.8):
@AtotiExtendedPluginValue(intf = IMessageHandlerRegistrar.class, key = "FrtbCoreMessageHandlerRegistrar")
public class FrtbCoreMessageHandlerRegistrar implements IMessageHandlerRegistrar {
    @Override
    public void registerHandlers(IDistributedMessenger messenger, IMultiVersionActivePivot pivot) {
        IMessageHandlerRepository repository = messenger.getMessageHandlerRepository();
        repository.setMessageHandler(BusinessDayCalendarMessage.class, new BusinessDayCalendarMessageHandler());
    }
}
After (6.0.9):
this.messageSender = CommunicationRegistration.startRegistering(BusinessDayCalendarMessage.class)
        .onMessageReceived((message, cubeIdentifier) -> {
            // handler logic inline
            return result;
        })
        .processOutput((message, pairs) -> {
            // merge results
            return mergedAnswer;
        })
        .registerOrReplace(manager);
The DistributedParametersRetriever constructor now requires an additional IActivePivotManager parameter. Update any custom instantiations accordingly.

6.0.7 to 6.0.8

Summary

New DLC Unload Topic Aliases

Eight new unload topic aliases have been added to allow selective, per-cube data unloading via DLC: UnloadSA, UnloadIMA, UnloadIMADRC, UnloadPL, UnloadStressCalibration, UnloadCommon, UnloadParameters, and UnloadAllData. No migration is required; these are purely additive. See Unload Topic Aliases for details.

OpenTelemetry configuration changes

OpenTelemetry has been upgraded and simplified:
  • SDK: 1.49.0 → 1.56.0
  • Instrumentation: 1.33.0-alpha → 2.22.0 (stable)
Breaking changes:
  1. tracing.enabled property removed — The OpenTelemetryTracingConfig class has been removed. Tracing is now configured entirely through OpenTelemetry Spring Boot auto-configuration.
  2. Exporters disabled by default — OpenTelemetry exporters (traces, metrics, logs) are now set to none by default. Previously, tracing was enabled by default when tracing.enabled=true.
Migration steps:
  • The tracing.enabled property can be removed from your configuration as it is no longer used.
  • If you were using tracing.enabled=false to disable tracing: No action needed (tracing is now off by default).
  • If you were using tracing.enabled=true with -Dotel.java.global-autoconfigure.enabled=true, replace with the new VM flags:
Before:
-Dotel.java.global-autoconfigure.enabled=true
After:
-Dotel.traces.exporter=otlp -Dotel.metrics.exporter=otlp -Dotel.logs.exporter=otlp

JGroups protocol files

The AtotiAuthToken class has been replaced with SharedSecretAuthToken. Update all JGroups protocol XML files to use the new class name. Before:
<AUTH auth_class="com.activeviam.activepivot.dist.impl.internal.distribution.security.impl.AtotiAuthToken"
      auth_token.auth_value="distribution_password"
      auth_token.token_hash="SHA"/>
After:
<AUTH auth_class="com.activeviam.common.distribution.security.SharedSecretAuthToken"
      auth_token.auth_value="distribution_password"
      auth_token.token_hash="SHA"/>

Distributed messaging API (if customized)

This section applies only if your project customizes distributed messaging classes. The following API changes have been made:
  • IAuthenticatedBroadcastMessage now takes 1 type parameter instead of 3. Update any class that implements or references this interface.
  • BusinessDayCalendarMessage has been simplified to AUniqueBroadcastMessage<BusinessDayCalendarMessageAnswer>. Handler logic previously embedded in the message class now lives in BusinessDayCalendarMessageHandler.
  • DatastoreMetadataMessenger is deprecated for removal. Its third type parameter has changed from IDistributedHierarchyManager to Void.
  • Custom message handlers should now implement IMessageHandlerRegistrar and register using @AtotiExtendedPluginValue(intf = IMessageHandlerRegistrar.class), rather than embedding logic in the message class itself.

Import changes

The constants AUTO_CONTRIBUTE_UNKNOWN_MEMBER_ALWAYS and AUTO_CONTRIBUTE_UNKNOWN_MEMBER_PROPERTY have moved from AxisHierarchyBase to IAxisHierarchyDescription. Update any imports or references in your project. Before:
import static com.activeviam.activepivot.core.impl.internal.cube.hierarchy.axis.impl.AxisHierarchyBase.AUTO_CONTRIBUTE_UNKNOWN_MEMBER_ALWAYS;
import static com.activeviam.activepivot.core.impl.internal.cube.hierarchy.axis.impl.AxisHierarchyBase.AUTO_CONTRIBUTE_UNKNOWN_MEMBER_PROPERTY;
After:
import static com.activeviam.activepivot.core.intf.api.description.IAxisHierarchyDescription.AUTO_CONTRIBUTE_UNKNOWN_MEMBER_ALWAYS;
import static com.activeviam.activepivot.core.intf.api.description.IAxisHierarchyDescription.AUTO_CONTRIBUTE_UNKNOWN_MEMBER_PROPERTY;

6.0.6 to 6.0.7

No migration needed.

6.0.5 to 6.0.6

Summary

Changes to the frtb-starter

  • The IFileUploadDataNodeClient interface has been updated in the frtb-starter module, the method createBranchForUIWithoutSimulation has been added to it.
  • The class FileUploadQueryNodeService has been changed extensively. It needs to be copied as is to your upgraded project.
  • In the class FileUploadQueryNodeRestController, the method resetDataNodeFiles does not throw an exception in its signature any more:
6.0.5:
  protected Map<String, FileUploadPayload> resetDataNodeFiles() throws Exception {...}
6.0.6:
  protected Map<String, FileUploadPayload> resetDataNodeFiles() {...}
  • The method createBranchForUI has been updated:
6.0.5:
@PostMapping(value = "/upload/{branch}")
@DependsOn(value = { "dataLoadController" })
public boolean createBranchForUI(
        @PathVariable("branch") String branch,
        @RequestParam("files") String[] files
) {
    if (files == null || files.length == 0) {
        return false;
    }
    try {
        Map<String, FileUploadPayload> dataNodeFiles = getDataNodeFiles();
        var branchCreated = fileUploadQueryNodeService.createBranchForUI(branch, files, dataNodeFiles);
        if (branchCreated) {
            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            String userName = authentication.getName();
            IDatabaseSimulationDefinition definition = new FileUploadSimulationDefinition(files);
            var permissions = new BranchPermissions(Set.of(userName), IBranchPermissions.ALL_USERS_ALLOWED);
            branchPermissionsManager.setBranchPermissions(branch, permissions);
            workflow.execute(new DatabaseSimulation(FILE_UPLOAD_WHATIF_NAME, definition, userName, branch));
        }
        return branchCreated;
    } catch (Exception e) {
        throw new FRTBServiceException(
                HttpStatus.INTERNAL_SERVER_ERROR,
                "Unable to copy the files from stage folder to what-if folder.",
                "Ensure that the files being requested are available to copy via the retrieveStagedFile endpoint",
                e
        );
    }
}
6.0.6:
@PostMapping(value = "/upload/{branch}")
  @DependsOn(value = { "dataLoadController" })
  public boolean createBranchForUI(
  		@PathVariable("branch") String branch,
  		@RequestParam("files") String[] files
  ) {
  	if (files == null || files.length == 0) {
  		return false;
  	}
  	try {
  		Map<String, FileUploadPayload> dataNodeFiles = getDataNodeFiles();
  		Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
  		String userName = authentication.getName();
  		IDatabaseSimulationDefinition definition = new FileUploadSimulationDefinition(files);
  		var sim = new DatabaseSimulation(FILE_UPLOAD_WHATIF_NAME, definition, userName, branch);
  		var status = workflow.execute(sim).getStatus();
  		if (!status.equals(DatabaseSimulationStatus.COMPLETED)) {
  			switch (status) {
  				case FAILED -> throw new ActiveViamSimulationException(sim);
  				case UNAUTHORISED -> throw new ActiveViamUnauthorizedException();
  				case UNKNOWN -> throw new ActiveViamUnknownSimulationException(sim.getSimulationId());
  				default -> {
  					return false;
  				}
  			}
  		} else {
  			return fileUploadQueryNodeService.createBranchForUI(branch, files, dataNodeFiles).equals(DatabaseSimulationStatus.COMPLETED);
  		}
  	} catch (Exception e) {
  		switch (e) {
  			case ActiveViamSimulationException activeViamSimulationException -> throw activeViamSimulationException;
  			case ActiveViamUnauthorizedException activeViamUnauthorizedException -> throw activeViamUnauthorizedException;
  			case ActiveViamUnknownSimulationException activeViamUnknownSimulationException -> throw activeViamUnknownSimulationException;
  			default -> throw new FRTBServiceException(
  					HttpStatus.INTERNAL_SERVER_ERROR,
  					"Unable to execute file-upload what-if simulation. Please check the logs for more information.",
  					"Ensure that the files being requested are available to copy via the retrieveStagedFile endpoint",
  					e
  			);
  		}

  	}
  }
  • In the class FileUploadPayload, the Lombok @EqualsAndHashCode annotation has been added, the topics attribute is now a set instead of a list, and the visibility of the topics and filePathSeparator attributes has been changed:
6.0.5:
@Data
@NoArgsConstructor
public class FileUploadPayload implements Serializable {
public String filePathSeparator;
public List<FileUploadTopic> topics;
private static final long serialVersionUID = 4349458336474922225L;

  /**
   * Constructor
     *
     * @param topics A List of {@link FileUploadTopic}s.
     */
  public FileUploadPayload(List<FileUploadTopic> topics) {
        this.topics = topics;
        this.filePathSeparator = File.separator;
  }
6.0.6:
@Data
@NoArgsConstructor
@EqualsAndHashCode
public class FileUploadPayload implements Serializable {
private String filePathSeparator;
private Set<FileUploadTopic> topics;

  private static final long serialVersionUID = 4349458336474922225L;

  /**
   * Constructor
     *
     * @param topics A Set of {@link FileUploadTopic}s.
     */
  public FileUploadPayload(Set<FileUploadTopic> topics) {
        this.topics = topics;
        this.filePathSeparator = File.separator;
  }
  • The class FileUploadRestServiceController has been changed extensively. It needs to be copied as is to your upgraded project.
  • In the class FileUploadTopic, the Lombok @EqualsAndHashCode annotation has been added, the files attribute is now a set instead of a list, and the visibility of the files and name attributes has been changed:
6.0.5:
@Data
@NoArgsConstructor
public class FileUploadTopic implements Serializable {
  public String name;
  public List<String> files;
  private static final long serialVersionUID = 4349474967374902823L;

  /**
   * Constructor
   *
   * @param name  Topic Name.
   * @param files List of file paths.
   */
  public FileUploadTopic(String name, List<String> files) {
    this.name = name;
    this.files = files;
  }
6.0.6:
@Data
@NoArgsConstructor
@EqualsAndHashCode
public class FileUploadTopic implements Serializable {
  private String name;
  private Set<String> files;
  private static final long serialVersionUID = 4349474967374902823L;

  /**
   * Constructor
   *
   * @param name  Topic Name.
   * @param files Set of file paths.
   */
  public FileUploadTopic(String name, Set<String> files) {
    this.name = name;
    this.files = files;
  }
  • In the CommonDimensionsConfig class, hard-coded strings have been replaced by constants:
6.0.5:
 public static ICanBuildCubeDescription<IActivePivotInstanceDescription> getHiMedLowDimension(ICanStartBuildingDimensions builder) {
 	//@formatter:off
 	var hierarchy = ConstantHierarchy
 				.hierarchy(CORRELATION_SCENARIO_HIERARCHY)
 				.withLevel(CORRELATION_SCENARIO_LVL)
 					.withComparator(new CustomComparator<>(List.of("High", "Medium", "Low", "Reference"), List.of()))
 				.withLevelPath(null, "High")
 				.withLevelPath(null, "Medium")
 				.withLevelPath(null, "Low")
 				.withLevelPath(null, "Reference")
 				.build();
 	return builder
 			.withDimension(CORRELATION_SCENARIO_DIM)
 			.withAnalysisHierarchy(hierarchy)
 			.withAggregationProcedure(AnalysisHierarchyExpansionProcedure.PLUGIN_KEY)
 			.end();
 	//@formatter:on
 }
6.0.6:
public static ICanBuildCubeDescription<IActivePivotInstanceDescription> getHiMedLowDimension(ICanStartBuildingDimensions builder) {
  	//@formatter:off
  	var hierarchy = ConstantHierarchy
  				.hierarchy(CORRELATION_SCENARIO_HIERARCHY)
  				.withLevel(CORRELATION_SCENARIO_LVL)
  					.withComparator(new CustomComparator<>(List.of(
  							CORRELATION_SCENARIO_HIGH,
  							CORRELATION_SCENARIO_MED,
  							CORRELATION_SCENARIO_LOW,
  							CORRELATION_SCENARIO_REF), List.of()))
  				.withLevelPath(null, CORRELATION_SCENARIO_HIGH)
  				.withLevelPath(null, CORRELATION_SCENARIO_MED)
  				.withLevelPath(null, CORRELATION_SCENARIO_LOW)
  				.withLevelPath(null, CORRELATION_SCENARIO_REF)
  				.build();
  	return builder
  			.withDimension(CORRELATION_SCENARIO_DIM)
  			.withAnalysisHierarchy(hierarchy)
  			.withAggregationProcedure(AnalysisHierarchyExpansionProcedure.PLUGIN_KEY)
  			.end();
  	//@formatter:on
  }

6.0.4 to 6.0.5

Summary

  • Crypto 2a Support: Added configuration, cube dimensions, measures, and starter module components to support Group 2a cryptoassets.
  • SBM Correlation Scenarios: Introduced a new cube dimension allowing user-defined correlation scenarios for enhanced control over SBM risk calculations.

Configuration files

Parameters

The following parameters have been added to the file FRTBParameters.csv:
IndexVertexFRTB Risk ClassRisk MeasureDateParameterSet
00.5Crypto 2aVega2016-01-01
11Crypto 2aVega2016-01-01
23Crypto 2aVega2016-01-01
35Crypto 2aVega2016-01-01
410Crypto 2aVega2016-01-01

Configuration properties

Properties added

PropertyDefault valueDescription
frtb.crypto-2a.apply-correlation-stressfalseIf set to false, the stress scenarios are ignored, and we use the same correlation constants for the ‘high’, ‘medium’ and ‘low’ scenarios. If set to true, the correlations for the ‘high’, ‘medium’ and ‘low’ scenarios are calculated in alignment with [MAR21.6].
frtb.crypto-2a.exchange-storedfalseEnables the addition of the optional Crypto2aExchange field in the UnderlyingDescription store.

Datastores

Added stores

StoreDetails
Crypto2aDeltaDoubleSumsCrypto 2a Delta Double Sums store. This is a technical store used for the crypto 2a calculations.
Crypto2aVegaDoubleSumsCrypto 2a Vega Double Sums store. This is a technical store used for the crypto 2a calculations.

Modified stores

ModificationStoreFieldTypeDescription
AddedUnderlyingDescriptionCrypto2aExchangeStringOptional field. The exchange where the crypto asset is traded. Disabled by default. See Crypto 2a UnderlyingDescription.

Cube schema

Added

CubeDimensionHierarchyLevelsDatastore fieldsDetails
StandardisedApproachCorrelation ScenarioCorrelation ScenarioScenarioThe members do not come from the datastore, they are defined in the definition of the hierarchy directly. See Correlation ScenarioUsers can now directly influence which correlation scenario is applied in the SBM Risk Charge and related measures.
StandardisedApproachDouble SumsCrypto 2a Delta Double SumsCrypto 2a Risk FactorField Crypto2aRiskFactor in store Crypto2aDeltaDoubleSums (technical store)This hierarchy is used to describe factors determining delta risk factor correlations for the Crypto 2a risk class.
StandardisedApproachDouble SumsCrypto 2a Vega Double SumsCrypto 2a Risk FactorField Crypto2aRiskFactor in store Crypto2aVegaDoubleSums (technical store)This hierarchy is used to describe factors determining vega risk factor correlations for the Crypto 2a risk class.
StandardisedApproachBucketsCrypto 2a BucketsCrypto 2a BucketField Bucket in store UnderlyingDescriptionSensitivity buckets for the Crypto 2a risk class.
StandardisedApproachRiskCrypto 2a ExchangeCrypto 2a ExchangeField Crypto2aExchange in store UnderlyingDescriptionThe exchange where the crypto asset is traded. This hierarchy is only added if the frtb.crypto-2a.exchange-stored property is set to true.

Measures

Added

CubeMeasureDetails
StandardisedApproachCrypto 2aSupport for Cryptoassets Group 2a

Integration of Crypto 2a into the frtb-starter module

The following classes have been added to the frtb-starter module:
  • Crypto2aService
  • Crypto2aConfig
and are imported in the FRTBConfig class:

  // Crypto 2a Configuration
  Crypto2aConfig.class,
  Crypto2aService.class
The Crypto2aConfigurationProperties is now included in the list of configuration properties classes in the class FRTBConfig:
@EnableConfigurationProperties({
        ...
		Crypto2aConfigurationProperties.class
})
The following classes have been modified to take into account the datastore and cube dimensions modifications needed:
  • CommonDimensionsConfig
    • In the getSARiskDimension method, the argument Crypto2aConfigurationProperties crypto2aProp has been added. Before:
      public static ICanBuildCubeDescription<IActivePivotInstanceDescription> getSARiskDimension(ICanStartBuildingDimensions builder) {
      
      Now:
      public static ICanBuildCubeDescription<IActivePivotInstanceDescription> getSARiskDimension(ICanStartBuildingDimensions builder,
      		Crypto2aConfigurationProperties crypto2aProp) {
      
    • The implementation of that method has been changed to add the Crypto 2a Exchange hierarchy: Before:
      return builder
          .withDimension(RISK_DIM)
              .withHierarchy(RISK_CLASSES_HIERARCHY)
                  .withLevel(RISK_CLASS_LVL)
      
       ...
      
              .withLevel(CRYPTO_2B_DIRECTION_LVL, DRC_DIRECTION_HIERARCHY);
      
      Now:
      var riskDimension = builder
              .withDimension(RISK_DIM)
                  .withHierarchy(RISK_CLASSES_HIERARCHY)
                      .withLevel(RISK_CLASS_LVL)
      
           ...
      
      		if(crypto2aProp.isExchangeStored()){
      		riskDimension = riskDimension
      				.withHierarchy(CRYPTO_2A_EXCHANGE_LVL)
      					.withLevel(CRYPTO_2A_EXCHANGE_LVL,CRYPTO_2A_EXCHANGE);
      	}
      
          return riskDimension;
      
  • The following method has been added:
    public static ICanBuildCubeDescription<IActivePivotInstanceDescription> getHiMedLowDimension(ICanStartBuildingDimensions builder) {
    	//@formatter:off
    	var hierarchy = ConstantHierarchy
    				.hierarchy(CORRELATION_SCENARIO_HIERARCHY)
    				.withLevel(CORRELATION_SCENARIO_LVL)
    					.withComparator(new CustomComparator<>(List.of("High", "Medium", "Low", "Reference"), List.of()))
    				.withLevelPath(null, "High")
    				.withLevelPath(null, "Medium")
    				.withLevelPath(null, "Low")
    				.withLevelPath(null, "Reference")
    				.build();
    	return builder
    			.withDimension(CORRELATION_SCENARIO_DIM)
    			.withAnalysisHierarchy(hierarchy)
    			.withAggregationProcedure(AnalysisHierarchyExpansionProcedure.PLUGIN_KEY)
    			.end();
    	//@formatter:on
    }
    
  • CubesDimensionsConfig The Crypto2aConfigurationProperties crypto2aProp configuration properties are now used in the standardisedApproachCubeDimensions bean, and the new Correlation Scenario dimension has been added to that bean. Before:
      @Qualifier("DimensionsStandardisedApproachCube")
    @Order(20)
    @Bean
    public DimensionsAdder standardisedApproachCubeDimensions(
            ParentChildProperties parentChildProperties,
            ParameterSetConfig parameterSetConfig
    ) {
        return merge(
                builder -> CommonDimensionsConfig.getBookingDimension(builder, irtDeskGroupsEnabled),
                builder -> CommonDimensionsConfig.getOrganizationDimension(builder, parentChildProperties),
                castToDimensionsAdder(categoriesHierarchyAdder),
                CommonDimensionsConfig::getSARiskDimension,
    
                ...
    
                CommonDimensionsConfig::getSaDefaultRiskChargeDimension,
                b -> CommonDimensionsConfig.getParameterSetsDimension(b, parameterSetConfig.root()),
                this::getDisplayCurrencyDimension);
    }
    
    Now:
    @Qualifier("DimensionsStandardisedApproachCube")
    @Order(20)
    @Bean
    public DimensionsAdder standardisedApproachCubeDimensions(
            ParentChildProperties parentChildProperties,
            ParameterSetConfig parameterSetConfig,
            Crypto2aConfigurationProperties crypto2aProp
    ) {
        return merge(
                builder -> CommonDimensionsConfig.getBookingDimension(builder, irtDeskGroupsEnabled),
                builder -> CommonDimensionsConfig.getOrganizationDimension(builder, parentChildProperties),
                castToDimensionsAdder(categoriesHierarchyAdder),
                b -> CommonDimensionsConfig.getSARiskDimension(b, crypto2aProp),
                CommonDimensionsConfig::getMarketDataDimension,
    
                ...
    
                CommonDimensionsConfig::getSaDefaultRiskChargeDimension
    			CommonDimensionsConfig::getHiMedLowDimension,
                b -> CommonDimensionsConfig.getParameterSetsDimension(b, parameterSetConfig.root()),
                this::getDisplayCurrencyDimension);
    }
    
  • DatastoreCustomisationsConfig The following bean has been added:
    @Qualifier(SP_QUALIFIER__CUSTOMISATIONS)
    @Bean
    @ConditionalOnExchangeDatastoreFieldEnabled
    DatastoreConfiguratorConsumer addCrypto2aExchangeToUnderlyingStore() {
    	return this::addCrypto2aExchangeToUnderlyingStore;
    }
    
    private void addCrypto2aExchangeToUnderlyingStore(IDatastoreConfigurator configurator) {
    	configurator.appendField(UNDERLYING_DESCRIPTION_STORE_NAME, new CustomField(
    			FieldDescription.builder()
    					.name(UNDERLYING_DESCRIPTION_STORE_CRYPTO_EXCHANGE)
    					.dataType(STRING)
    					.build()));
    }
    

Miscellaneous

The following dependency has been added to the frtb-starter POM file:
<dependency>
    <groupId>com.activeviam</groupId>
    <artifactId>atoti-server-test</artifactId>
    <scope>test</scope>
</dependency>

6.0.3 to 6.0.4

Summary

6.0.2 to 6.0.3

Summary

  • Virtual hierarchies can be set with the property frtb.configuration.virtual-hierarchies.
  • The new Curvature CVR measure will be disabled by default in 6.0.x versions of . To enable it, set the property frtb.curvature-cvr.enabled=true in the application.yaml file.
  • Cube distribution can now handle data overlap. This means it is possible to have several data cubes with duplicated data. you need to set frtb.distribution.enable-data-duplication=true.
  • HistoricalDatesProvider no longer queries the base stores for the list of historical dates. This is achieved by using the database statistics to gather the set of unique dates. The HistoricalDatesProvider can be reverted to the previous behavior of executing distinct datastore queries by setting the property frtb.historical-dates-provider.is-using-approximate-members=false.
  • The zero risk-weight can now be specified per obligor and jurisdiction, defaulting to 0%.

Breaking changes

None.

Deprecations

  • Cube distribution by field: Distribution of data cubes across nodes by defining clustering fields is deprecated, it should be done with distribution levels.

Input file formats

Added

FileDetails
DRC_Public_Sector_Obligor_Risk_Weights.csvUse this file to configure specific zero risk-weights per obligor and jurisdiction.

Configuration properties

Properties added

PropertyDefault valueDescription
frtb.configuration.virtual-hierarchiesEmptyA list of hierarchies to set as virtual.
frtb.curvature-cvr.enabledfalseEnables the new Curvature CVR measures.
frtb.distribution.levels.sa-cubeAsOfDate@Date@DatesThe levels used for the StandardisedApproachCube distribution.
frtb.distribution.levels.ima-cubeAsOfDate@Date@DatesThe levels used for the InternalModelApproachCube distribution.
frtb.distribution.levels.ima-drc-cubeAsOfDate@Date@DatesThe levels used for the IMADRCCube distribution.
frtb.distribution.levels.pl-cubeAsOfDate@Date@DatesThe levels used for the PLCube distribution.
frtb.distribution.levels.stress-calibration-cubeAsOfDate@Date@DatesThe levels used for the StressCalibrationCube distribution.
frtb.distribution.priority.sa-cubeEmptyThe priority of the StandardisedApproachCube in cases of data overlap within a horizontal distribution.
frtb.distribution.priority.ima-cubeEmptyThe priority of the InternalModelApproachCube in cases of data overlap within a horizontal distribution.
frtb.distribution.priority.ima-drc-cubeEmptyThe priority of the IMADRCCube in cases of data overlap within a horizontal distribution.
frtb.distribution.priority.pl-cubeEmptyThe priority of the PLCube in cases of data overlap within a horizontal distribution.
frtb.distribution.priority.stress-calibration-cubeEmptyThe priority of the StressCalibrationCube in cases of data overlap within a horizontal distribution.
frtb.distribution.enable-data-duplicationfalseSet to true to allow duplicate members in the distribution level of horizontally distributed data cubes.
directquery.incremental-refreshEmptyConfigures increment refresh templates.
frtb.historical-dates-provider.is-using-approximate-memberstrueIf true (default), the HistoricalDatesProvider will use the database statistics to gather the unique set of dates from the stores.
If false, it will revert to the previous behavior of executing distinct datastore queries.
frtb.historical-dates-provider.stores-to-scan[PLTrades, IMATrades, DRCIMABase, SASensitivities, StressCalibrationTrades]The list of stores to scan to collect the historical dates from.
frtb.historical-dates-provider.as-of-date-fieldAsOfDateThe name of the date field to use when querying the stores for historical dates.

Properties files

Files Modified

frtb-data-load.properties
New properties:
Property NameCommentValue
drc.public-sector.obligor-risk-weights.file-patternFile pattern used to load the PublicSectorObligorRiskWeights store.**/DRC_Public_Sector_Obligor_Risk_Weights*.csv{,.gz}

Datastores

Added stores

StoreDetails
PublicSectorObligorRiskWeightsThis store contains optional risk-weights for public sector obligors applied to zero risk-weight exposures in the DRC non-securitisations calculation.

Databases

Added tables

TableDetails
PUBLIC_SECTOR_OBLIGOR_RISK_WEIGHTSThis store contains optional risk-weights for public sector obligors applied to zero risk-weight exposures in the DRC non-securitisations calculation.

Measures

Added

CubeMeasureDetails
StandardisedApproachCurvature CVRThis measure uses the underlying Curvature CVR Up or Curvature CVR Down measure depending on the “direction” of the Risk Position Scenario at the Bucket level. A new intermediate measure Curvature Bucket Scenario evaluates the Risk Position Scenario measure at the Book level.
This measure has been added for the following risk classes within sa-sbm:
- Commodity
- CSR non-Sec
- CSR Sec CTP
- CSR Sec non-CTP
- Equity
- FX
- GIRR
StandardisedApproachCrypto 2bSupport for Cryptoassets Group 2b

6.0.1 to 6.0.2

No migration needed.

6.0.0 to 6.0.1

No migration needed.

Breaking changes

None

Summary

  • Upgraded to Data Connectors 5.0.4

5.3.0 to 6.0.0

Upgrading from version 5.3.0, see 6.0 Release Notes. uses 6.1.7 and 5.2.x. For new features and fixes included in these releases, please see the documentation and Migration Notes, and the release notes for .

Breaking changes

  • Measure Configuration: The text replacement template for measure configuration now uses the pattern #{_name_} instead of ${_name_}. See Startup Properties.
  • frtb-application module: Some of the content of the frtb-starter module has been moved to the new frtb-application module.
  • DLC 5.0 Upgrade: With the new version of the DLC, the configuration of the ETL has been simplified.
  • What-if endpoints: The (undocumented) what-if REST endpoints used by the Switch Desk Model and Switch Book Desk what-if simulations have changed.
  • DoctorPivot endpoint: DoctorPivot is now embedded within the AdminUI. See Relocation of DoctorPivot for more.

Headline announcement

  • Upgraded to 6.1.7 : Upgraded to the latest .
  • Upgraded to JDK 21 : Upgraded from JDK 17 to JDK 21 to utilize the latest features.
  • Removed ActiveMonitor : The Active-Monitor module and related features have been removed.
  • frtb-application module: The frtb-application module replaces the frtb-starter module. All customizations should now be done in the frtb-application module, or in a new module based on the frtb-application module.
  • Sign-Off Service Availability: The Sign-Off REST service now throws ServiceUnavailableExceptions until the initial data loading phase has been completed. The Sign-Off REST service now provides a GET /enabled endpoint to check if the service is currently enabled.
  • Simplified OpenTelemetry Configuration: We now rely on OpenTelemetry’s GlobalOpenTelemetry to configure the export of logs and metrics.
  • OpenRewrite recipes As an experimental feature, we have added OpenRewrite recipes that you can use to automate some of the migration steps.

OpenRewrite recipes

We have included these OpenRewrite recipes as an experimental feature and would welcome your feedback on their usefulness in your migration. We can then evaluate the feature for potential inclusion in future releases. Please report any issues you have through the normal Jira channels.
To help with upgrades, we have created a set of OpenRewrite recipes that can be used to automatically perform some of the migration steps from 5.3 to 6.0. The recipes included in this release are:
Recipe NameDescription
com.activeviam.frtb.Migrate_6_0Runs all 6.0 migration recipes.
com.activeviam.frtb.FileUpload_6_0Updates the properties for the file-upload what-if. This includes:Renames csvSource.subdirectory.dataset.whatif to file-upload.csv-source-subdirectory, Adds file-upload.staging-directory as the combination of input.data.root.dir.path (or csv-source.dataset) and csvSource.subdirectory.dataset.stage by referencing the old properties.
com.activeviam.frtb.DQAutoVectorizer_6_0Deletes the old, unused activeviam.directquery.enableAutoVectorizer property.
com.activeviam.frtb.DataDirectories_6_0Updates the properties configuring the data directories. This includes:Standardizes the case of csv-source., Adds csv-source.dataset-historical=${csv-source.dataset}/historical., Adds csv-source.dataset-configuration=${csv-source.dataset}/configuration.
See Using OpenRewrite in Atoti FRTB for instructions on how to run the recipes.

frtb-application module

The new frtb-application Maven module has been split out of the frtb-starter Maven module.

Components moved

The following components have been moved into the new module:
  • FRTBApplication class including the main() method.
  • Spring security configuration
  • OpenTelemetry configuration
  • Logging configuration
  • Content Service configuration
  • Configuration files

Configuration classes moved

For the full list of configuration classes that have been moved into the frtb-application module, see the Moved Classes section.

Data & Test folders moved

The sample data located at /frtb-starter/src/test/resources/ has been moved out of the frtb-starter module to the /sample-data/ folder located at the root of the project. The tests included in the frtb-starter module have been moved into the new frtb-application-tests module.

OpenTelemetry Configuration

The previous OpenTelemetry configuration has been replaced with a simple OpenTelemetry bean. To enable the autoconfiguration of this bean, set -Dotel.java.global-autoconfigure.enabled=true on the command line.

FX Translation Risk

The field “Translation Risk Currency” has been added to support loading translation risk for different reporting currencies. It is now possible to load different translation risks for different reporting currencies. This field is only used if FXComplexTrade=Y (otherwise the translation risk is calculated automatically).
  • If this field is empty, the sensitivity is not treated as translation risk but instead treated normally.
  • If this field is set, then the sensitivity will be interpreted as translation risk for that currency. It will be filtered and only used if the translation risk currency is the same as the reporting currency.

Alternative root parameter sets

The property parameter-set.root has been added to specify the root parameter set in the configuration and input files. It is expected that input files are generated for the parameter set specified in this property. Additionally, the configuration files containing parameters will need to be adapted to the new root parameter set.
  • Previously, when no parameter set was specified in the configuration it was assumed to be “BCBS”. Now, these parameters will default to the specified root parameter set.
  • Parameter configuration will need to be modified for the new root parameter set.
For example, for the bucket used for CSR non-Sec covered bonds we have in FRTBParameters.csv:
NameValueDateParameterSet
sa.csr-nonsec.bucket.covered-bonds82016-01-01
sa.csr-nonsec.bucket.covered-bonds102016-01-01CRR2
If you want to set CRR2 as the root parameter set, the above two lines can change to become:
NameValueDateParameterSet
sa.csr-nonsec.bucket.covered-bonds82016-01-01BCBS
sa.csr-nonsec.bucket.covered-bonds102016-01-01
So that the value in the CRR2 parameter set is still “10”, and the value for the BCBS parameter set is still “8”.

Summing Sensitivities

When multiple sensitivities with the same key fields are loaded, they are now summed. Previously this was only done when processing a chunk within a file, now it is done across the whole transaction. The following configuration has been added to application.yaml and will sum sensitivities and PVs for the SASensitivities store, making sure that the currency and a few other fields are the same.
datastore-sum-duplicates:
  SASensitivities:
    matching: ["Ccy", "RiskWeight", "FXOtherCcy", "Direction"]
    summing: ["Sensitivity", "Shift_Up_PV", "Shift_Down_PV", "PresentValue", "Notional", "Adjustment"]

FRTB Modules

Removed

ModuleDetails
frtb-activemonitorActiveMonitor and associated configurations have been removed from .

Added

ModuleDetails
frtb-applicationProvides an example Spring Boot Application for Atoti FRTB.
* Contains simple configurations required to run Atoti FRTB.* Is intended to be used as a reference for clients to build their own applications as this module is not production-ready.
* Provides various Spring profiles outlining the properties required to run the application in different environments.
For example, the profile dist-query-node activates the application-dist-query-node.yaml configuration file which defines the properties required to run the application as a distributed query node.
tipTo help ease upgrade efforts, move all customizations into your new module.

DLC 5.0 upgrade

The upgrade to DLC 5.0 has brought some significant changes to the ETL configuration. For non-FRTB specific DLC migration, please see the DLC 5.0 Migration Guide. DLC configurations for have now been organized into FrtbDlcConfig.

Loading Topic Configurations

Before the DLC redesign, ChannelParameters were being used to encapsulate DLC configurations into beans. Now, configurations that were previously found as ChannelParameters beans can be found as Topic Descriptions in the following classes:
Old ClassNew Class
AConfigurationSourceConfigConfigurationSourceDescription
ASourceConfigSourceDescription
ASensiSourceConfigSensiSourceDescription
Column calculators are now configured as DLC CustomFieldDescription beans and have been organized into CustomFieldDescriptionConfig. The DLC implicitly adds CSVColumnParser column calculators based on the store being targeted, so those have been removed from the topic configurations. The new DLC also lets you configure parser overrides. In they can be found in ColumnParserOverridesDescriptionConfig. Tuple publishers are now configured as DLC TargetDescription beans and have been organized into TargetDescriptionsConfig.

Unloading Topic Configurations

Unloading topics are now completely separate from loading topics. They are configured in UnloadTopicDescriptionsConfig.

Topic Aliases

Old ClassNew Class
SourceTopicAliasesAliasesDescriptionConfig

ETL Extension Updates

See the following sections on how the ETL extensions have changed with the new DLC:

Removed classes

See the list of classes removed as part of the DLC 5.0 upgrade.

Video overview

Check out our video on migrating to Data Connectors 5.0 in 6.0:

Input file formats

Modified

ModificationFileFieldOptionalDescription
AddedSBM_Delta_Sensitivities.csvTranslation Risk CcyYFX only. Indicates the sensitivity represents translation risk; set to the reporting currency.
AddedSBM_Summary_Delta_Sensitivities.csvTranslation Risk CcyYFX only. Indicates the sensitivity represents translation risk; set to the reporting currency.
AddedTrade_Attributes.csvInclusionYIndicates if the trade should be included (“Y”) or not by default in the calculations.
Default is ‘Y’

Startup properties

The file frtb-config.properties is now loaded into the Spring Boot environment, so the properties in this file can be overridden on the command line. The file measures-config.json is now also loaded into the Spring Boot environment. The json file is converted to properties with the prefix “measures”. The text replacement template in these files now uses the pattern #{_name_} instead of ${_name_}. The ${_name_} pattern can still be used for Spring Boot’s property placeholders.
Property NameCommentValueDefault Definition in File
dlc.enabledEnables or disables the Data Load Controller.true or falseapplication.yaml
file-upload.staging-directoryThe staging directory for the File Upload.${csv-source.dataset}/stageapplication.properties
file-upload.csv-source-subdirectoryThe sub-directory of files on which the What-If is executed.true or falseapplication.properties
csv-source.dataset-historicalPath to the directory containing historical files to load.${csv-source.dataset}/historicalapplication.properties
csv-source.dataset-configurationPath to the directory containing the configuration files to load.sample-data/configurationapplication.properties
parameter-set.rootRoot parameter set.Defaults to “BCBS”
datastore-sum-duplicates._store-name_.matchingList of names of fields that must match when summing duplicates for the store store-name.
If missing, all fields are matched; if empty, no fields are matched.
datastore-sum-duplicates._store-name_.summingList of names of fields that should be summed when there are duplicates for the store store-name.
directquery.aggregate-tablesConfiguration of the Aggregate Tables to be used when running with DirectQuery.Mapping of aggregate tables per cubeapplication.yaml
whatif.datastore..*Simple datastore changes what-if simulations. See Simple Datastore Changes.inclusion-change what-if simulation definition.application.yaml
Updated properties: changed values or renamed Changed values:
Old PropertyNew PropertyCommentDefault Definition in File
csv-source.parserThreadscsv-source.parser-threadsThe naming convention has changed from camel case to kebab case, but the old property key will still work.application.properties
csv-source.bufferSizecsv-source.buffer-sizeThe naming convention has changed from camel case to kebab case, but the old property key will still work.application.properties
aws.accessKeyIdaws.accessKeyIdPreviously managed by FRTB, now inheriting AWS SDK property aws.accessKeyId in DefaultCredentialsProviderfrtb-cloud.properties
aws.secretKeyaws.secretAccessKeyPreviously managed by FRTB, now inheriting AWS SDK property aws.secretAccessKey in DefaultCredentialsProviderfrtb-cloud.properties
azure.connection.stringdlc.azure.connection-stringPreviously managed by FRTB, now inheriting DLC property dlc.azure.connection-string for DefaultAzureClientConfigfrtb-cloud.properties
Deleted properties:
Property NameCommentDeleted from File
activeviam.directquery.enableAutoVectorizerThe property is no longer being used.application.properties
input.data.root.dir.pathThis is now a part of file-upload.staging-directoryapplication.properties
csvSource.subdirectory.dataset.stageThis is now a part of file-upload.staging-directoryapplication.properties
csvSource.subdirectory.dataset.whatifThis is now file-upload.csv-source-subdirectoryapplication.properties
cloudSource.datasetcsv-source.dataset-historical, csv-source.dataset-configuration and csv-source.dataset are now shared between cloud sources and localfrtb-cloud.properties
cloud.fetch.threadNo longer configurablefrtb-cloud.properties
dlc.audit-logging.enabledDLC event handlers are no longer a part of the new DLCapplication.properties

Configuration files

Files Modified

FRTBParameters.csv
ModificationParameterTypeDefaultDescription
Deprecated (for removal)sa.drc.no-maturity-floor-when-offsettingbooleanfalseParameter is no longer needed ref

Datastores

Modified stores

ModificationStoreFieldTypeDescription
AddedTrade MappingInclusionStringIndicates if the trade should be included (“Y”) or not by default in the calculations.
AddedSaSensitivitiesTranslation Risk CcySTRINGFX only. Indicates the sensitivity represents translation risk; set to the reporting currency.

Databases

Modified tables

ModificationTableFieldTypeDescription
AddedSASENSITIVITIESTRANSLATION_RISK_CCYStringFX only. Indicates the sensitivity represents translation risk; set to the reporting currency.
AddedTRADE_MAPPINGINCLUSIONStringIndicates if the trade should be included (“Y”) or not by default in the calculations.

Cube schema

Added

CubeDimensionHierarchyLevelsDatastore fieldsDetails
AllBookingInclusionInclusionTradeMapping.InclusionThis hierarchy is used to indicate which trades should be included in the calculations.

Modified Classes

The following classes have been added, removed or had their function replaced with new classes.

Added Classes

AddedRationale
DatastoreChangeSimulationsWhatIf definitions have been restructured.
SummingDuplicateKeyHandlerDuplicateKeyHandler that sums tuples.
TableSecurityConfigConfigures the security roles for the actions that can be taken on the datastore.
OpenTelemetryTracingConfigConfigures the OpenTelemetry service for the application.

Removed Classes

DataLoadController
The following classes related to the DLC and data loading have been removed as part of the DLC 5.0 upgrade.
RemovedReplacementRationale
ICsvSourceConfigDLC 5.0 reduces complexity.
IJdbcSourceConfigDLC 5.0 reduces complexity.
ISourceConfigDLC 5.0 reduces complexity.
ACSVSourceConfigDLC 5.0 reduces complexity.
AConfigurationSourceConfigConfigurationSourceDescriptionThe source itself is now configured as multiple a Source Descriptions. ChannelParameters found in this class are now configured as Topic Descriptions.
ASensiSourceConfigSensiSourceDescriptionThe source itself is now configured as multiple a Source Descriptions. ChannelParameters found in this class are now configured as Topic Descriptions.
ASourceConfigSourceDescriptionThe source itself is now configured as multiple a Source Descriptions. ChannelParameters found in this class are now configured as Topic Descriptions.
SensiSourceConfigDLC 5.0 reduces complexity.
ConfigurationSourceConfigDLC 5.0 reduces complexity.
SourceConfigDLC 5.0 reduces complexity.
SourceTopicAliasesAliasesDescriptionConfigAliases are now configured as AliasesDescription.
CompositeTopicConfigDLC 5.0 reduces complexity.
TopicConfigDLC 5.0 reduces complexity.
DataLoadControllerFileConfigDLC 5.0 reduces complexity.
SimpleCsvSourceConfigDLC 5.0 reduces complexity.
SimpleJdbcSourceConfigDLC 5.0 reduces complexity.
SimpleSourceConfigDLC 5.0 reduces complexity.
ITuplePublisherDlcHealthEventHandlerDLC 5.0 handles events itself.
TuplePublisherDlcHealthEventHandlerDLC 5.0 handles events itself.
TuplePublisherDlcTuplesAddedDLC 5.0 handles events itself.
WhatIf
The following classes have been replaced with DatastoreChangeSimulations because the configuration of WhatIfs has changed.
Removed
BookDeskSwitchSubmissionDTO
DeskModelSwitchSubmissionDTO
BookDeskSwitchRestServiceController
DeskModelSwitchRestServiceController
BookDeskSwitchSimulationDefinition
DeskModelSwitchSimulationDefinition

Moved Classes

ClassPrevious Module & PackageNew Module & Package
LocalContentServiceConfigfrtb-starter/com.activeviam.frtb.starter.cfg.implfrtb-application/com.activeviam.frtb.application.config.content
RemoteContentServiceConfigfrtb-starter/com.activeviam.frtb.starter.cfg.implfrtb-application/com.activeviam.frtb.application.config.content
BasicAuthenticationProviderConfigfrtb-accelerator/com.activeviam.frtb.ref.cfg.impl.securityfrtb-application/com.activeviam.frtb.application.config.security
SecurityConfigfrtb-accelerator/com.activeviam.frtb.ref.cfg.implfrtb-application/com.activeviam.frtb.application.config.security
UserDetailsServiceConfigfrtb-starter/com.activeviam.frtb.starter.cfg.impl.securityfrtb-application/com.activeviam.frtb.application.config.security

Migrating to using Atoti Starters

now provides Spring Boot Starters to aid in application development. These starters will auto-configure some basic and required beans for the application to run. has been updated to use these starters. The following changes have been made:
ChangeDescription
Removal of JMXEnabler BeansThe JMXEnabler beans have been removed from as the ‘s Starters provide these beans automatically for us.
Removed FRTBI18nConfig Configuration ClassThis class is now autoconfigured by .
Removed SameSiteConfigThe SameSite config is handled by Spring.

Historical Date Provider Service

The historical dates used for the Lookback hierarchy measures are now configurable via a IHistoricalDatesProvider bean. By default, a HistoricalDatesProvider (configured in HistoricalDatesProviderConfig) will be created that provides all AsOfDates available in all base stores.

Sign-Off REST services

The implementation of the Sign-Off REST service now has a Boolean to enable state flag. Out of the box, the Sign-Off REST services are disabled until the initial load is completed. This prevents the Sign-Off server from sending requests on those services before the end of the initial load. The status of the Sign-Off service can be retrieved through a GET request at /enabled. exceptions are now used instead of the previously used Javax exceptions. Error messages and constants have been fixed. Their prefix and/or content was previously incorrect.In particular, the constant ERROR_MESSAGE has been replaced by the constant ERROR_MESSAGE_NO_VALID_DTO_PROVIDED. The exception message prefix has been changed from "[EXPORT]" to "[SIGN-OFF]" in the error message constants.

Relocation of DoctorPivot

DoctorPivot has been moved from the endpoint /frtb-starter/doctorpivot to now being embedded within the AdminUI’s Measures dependencies tab which is located at: /frtb-starter/admin/ui/index.html#/measures-dependencies.