Skip to main content

Migrate to 6.2

This page describes the best strategy to upgrade to 6.2. Read the Release notes to get familiar with major changes for this release. This guide refers to changes in migration order. The Release notes refers to the changes based on their importance or significance. For this migration, an automated OpenRewrite migration recipe is provided. Run it at the specified step of the migration process.

Packaging changes

All the artifacts are available on JFrog Artifactory. There are two client-facing entrypoints: Read the download page to see how to configure those entry points. The channel mvn includes mvn-prod and also includes pre-release (alpha, beta, milestone, release candidate) and continuous builds. Visibility of Maven artifacts depends on the access rights of the account. Some artifacts, such as continuous build, may not be accessible if the required permissions are not granted. Atoti is not distributed on artifacts.activeviam.com.

Preparatory work

  • Upgrade at least to version 6.1.20
  • Check for use of avinternal/internal/private_ in imports and replace them. Do not hesitate to fill a support ticket to seek for an alternative
  • Fix Spring deprecations, follow Spring guide
  • Try building the project with JDK 25. Some dependencies may require an upgrade for the build to succeed — for example, Lombok must be upgraded to a JDK 25-compatible version (1.18.40+).
  • Check for use of removed features

Upgrade

  • Run the automated OpenRewrite migration recipe
  • Update the poms to the new Java version, Spring Boot version and Atoti version
  • Atoti Server 6.2 moves to Spring Boot 4, which brings Jackson 3 (com.fasterxml.jackson.*tools.jackson.*). Migrate your Jackson usage with OpenRewrite’s UpgradeJackson_2_3 recipe.
  • If you overrode the admin-ui.version Maven property to pin the Atoti Admin UI version, this property is removed: all Atoti UI artifacts (atoti-ui, atoti-ui-initial-content, atoti-admin-ui) are now versioned by the single atoti-ui.version property
  • Logging configuration
    • If JUL is used for logging, add a dependency to org.slf4j:slf4j-jdk14
    • If a different logging framework is used, remove the dependency to org.slf4j:jul-to-slf4j
  • Compile and test
If the code does not compile automatically after these steps, please file a ticket with the code that failed to be migrated, as it should have been handled by the migration recipes.

Post-upgrade

As part of the migration, the name of some loggers and JVM property may have changed. Warnings will be logged at runtime when using the legacy names in order to allow to identify the ones to migrate. Monitor the logs for these warnings.

Manual changes

The following changes are not handled by the automated recipe and must be applied manually.
  • IActivePivotContentServiceConfig is deprecated. If you implement this interface, the @Bean annotation is not inherited from the interface for activePivotContentService(). Add @Bean explicitly to your implementing method, or migrate to declaring IActivePivotContentService as a standalone @Bean.
  • ICsvParserConfigPolicy, LineAndFileLimitCsvParserPolicy, and NoRestrictionCsvParserConfigPolicy have been removed from the CSV source API, along with CsvParserConfiguration.getParserPolicy() and setParserPolicy(). These APIs allowed limiting the number of lines or files read and sampling rows with a step; this functionality has been removed with no replacement. Remove any reference to these types and methods.
  • IParquetReaderPolicy and IParquetParserBuilder.withPolicy(IParquetReaderPolicy) have been removed from the Parquet source API. These APIs allowed limiting the number of lines or files read and sampling rows with a step; this functionality has been removed with no replacement. Remove any reference to this type.
  • SnowflakeDatabaseSettings.lastAlteredMargin has been removed. A recently-altered table is now read at the Snowflake CURRENT_TIMESTAMP sampled when the version is built instead of at its (possibly lagging) LAST_ALTERED.
  • Range sharing can now be configured only through the IQueryExecution context value:
    • Default behavior — add a QueryExecution context value to the cube’s shared context with withSharedContextValue(QueryExecution.builder().rangeSharingEnabled(false).build()).
    • Per-query behavior — include the same QueryExecution context value in the query’s context values.
  • IActivePivotManagerDescriptionConfig is deprecated. If you implement this interface, remove implements IActivePivotManagerDescriptionConfig from your class declaration and add @Bean explicitly to your managerDescription() method. If you relied on the default epochManagementPolicy() provided by the interface, it is no longer needed: the default KeepLastEpochPolicy is applied automatically. To use a custom policy, declare an IEpochManagementPolicy @Bean in your configuration.
  • IDatastoreConfig is deprecated. If you implement this interface, remove implements IDatastoreConfig from your class declaration and add @Bean @DependsOn("poolsCleaner") explicitly to your database() method. If you are using the Atoti Spring Boot starter, poolsCleaner is provided automatically by AtotiSystemAutoConfiguration — no further changes are needed. Otherwise, also copy the poolsCleaner bean into your configuration class:
    @Bean
    public AutoCloseable poolsCleaner() {
      return AtotiPools::stop;
    }
    
  • IRoleContextConfig is deprecated. If you implement this interface, remove implements IRoleContextConfig from your class declaration and add @Bean explicitly to your entitlementsProvider() method.
  • IDatastoreSchemaDescriptionConfig is deprecated. If you implement this interface, remove implements IDatastoreSchemaDescriptionConfig from your class declaration and add @Bean explicitly to your datastoreSchemaDescription() method.
  • IParameterAwareDatastoreSchemaDescriptionConfig is deprecated. If you implement this interface, remove implements IParameterAwareDatastoreSchemaDescriptionConfig from your class declaration and add @Bean explicitly to your datastoreSchemaDescription() and parameterStoreConfiguration() methods. The bean Collection<UnaryOperator<IDatastoreSchemaDescription>> descriptionTransformations() has been deleted. If you had custom transformations, those should be applied when implementing the IDatastoreSchemaDescription datastoreSchemaDescription() bean.
  • Several methods of the Datastore transaction API (package com.activeviam.database.datastore.api.transaction) no longer declare throws DatastoreTransactionException, because they could never actually throw it. The affected methods are:
    • ITransactionalWriter#remove(String, Object...)
    • ITransactionalWriter#removeAll(String, Collection)
    • IOpenedTransaction#updateWhere(ISelection, ICondition, IUpdateWhereProcedure)
    • IOpenedTransaction#rollback()
    • ITransactionManager#rollbackTransaction()
    • ITransactionManager#stop()
    Since DatastoreTransactionException is a checked exception, a try block wrapping only calls to these methods with a catch (DatastoreTransactionException e) clause will no longer compile. Remove the now-dead catch clause, or the entire try if it was the only catch. In a multi-catch such as catch (DatastoreTransactionException | SomeOtherException e), remove only the DatastoreTransactionException alternative. Methods that still throw it, such as commitTransaction(), startTransaction(...) and removeWhere(...), are unaffected, so a catch that also wraps one of those stays as-is.
  • The String-based distributing level APIs have been removed. Replace usages as follows, converting each former String level name to a LevelIdentifier (constructed with dimension name, hierarchy name, and level name):
    • IApplicationDescriptionBuilderWithId#withDistributingFields(String...)withDistributingLevels(LevelIdentifier...)
    • QueryClusterDefinition.DistributedApplicationDefinition(String, List<String>)QueryClusterDefinition.DistributedApplicationDefinition(String, List<LevelIdentifier>)
  • IDistributedApplicationDefinition#getDistributingFields() has been removed. Use getDistributingLevels() instead, which returns a List<LevelIdentifier>.
  • com.activeviam.database.api.schema.DataTable has been removed. This change is not handled by the automated migration recipe — replace constructor calls manually with the description API matching your stack:
    • Datastore tables: new DataTable(name, keyFieldNames, fields) becomes StoreDescription.simpleBuilder().name(name).keyFieldNames(keyFieldNames).fields(fields).build(). The fields list should now contain IFieldDescription instances (from com.activeviam.database.datastore.api.description) instead of IDataTableField. Replace new DataTableField(...) with FieldDescription.builder()…build() from the same package.
    • DirectQuery tables: new DataTable(name, keyFieldNames, fields) becomes TableDescription.builder().externalTable(...).withSameLocalName().fields(fields).keyFieldNames(keyFieldNames).build(), supplying the appropriate ExternalTable. The fields list should now contain AFieldDescription instances (from com.activeviam.directquery.api.schema) instead of IDataTableField. Replace new DataTableField(...) with FieldDescription.builder()…build() from the same package.
  • IActivePivotBranchPermissionsManagerConfig has been deprecated and no longer carries @Configuration or @Bean. Implementing it no longer exposes a branch permissions manager bean. Stop implementing this interface and expose IBranchPermissionsManager as a @Bean from a @Configuration class directly.
  • IActivePivotConfig has been deprecated and no longer carries @Configuration or @Bean. Implementing it no longer exposes a branch permissions manager bean. Stop implementing this interface and expose IActivePivotManager as a @Bean from a @Configuration class directly.
  • MapGetAggregatesQuery and MapDrillthroughQuery now always convert to the built-in GetAggregatesQuery and DrillthroughQuery implementations. It is no longer possible to use a custom implementation registered under IGetAggregatesQuery.PLUGIN_KEY or IDrillthroughQuery.PLUGIN_KEY.
  • IGetAggregatesContinuousQuery interface has been moved to an internal package; there shouldn’t be any reason to need it.
  • Conditions (package com.activeviam.tech.core.api.filtering) are no longer extended-plugin values:
    • ILogicalCondition and IMatchingCondition no longer extend IExtendedPluginValue, so the plugin-1ey constants and the getType() method are removed from all conditions.
    • Instantiate conditions directly with their public constructors instead of going through the registry:
      • Registry.getExtendedPlugin(IMatchingCondition.class).valueOf(IMatchingCondition.EQUAL).create(value)new EqualCondition(value)
      • Registry.getExtendedPlugin(IMatchingCondition.class).valueOf(IMatchingCondition.IN).create(values)new InCondition(values)
      • Registry.getExtendedPluginValue(ILogicalCondition.class, ILogicalCondition.AND).create(conditions)new AndCondition(conditions)
    • Replace getType() string comparisons with instanceof/pattern matching on the concrete condition class, e.g. condition.getType().equals(ILogicalCondition.AND)condition instanceof AndCondition.
  • ClickhouseProperties has been removed. Use ClickhousePropertiesV2 instead, as the ClickHouse connector has been upgraded to use a new client. There is no recipe to automatically build the new properties.
  • IContextualQuery, IListQuery, IStringQuery and AListQuery have been moved to an internal package. There should be no need to migrate customer code unless you were directly importing or subclassing these types, which is an unsupported pattern.
  • The deprecated class com.activeviam.tech.core.api.tracking.Tracing has been removed.
  • The Netty max message size property (nettyMessageMaxSize) and the setMaxSizeForMessage MBean operation no longer accept fully-qualified class names. Replace any class name with the matching public message-type keyword listed in NettyMessageType. An unknown key now raises a configuration error.
  • CubeFilter.getSubCubeFromContext(IContext) has been removed. Use CubeFilter.getSecurityAndFilter(IContext) instead.
  • CubeFilter.intersectWithSecurity(ICubeFilter, IContext) has been removed. There is no public replacement for this method.
  • IQueriesService.execute() method has been changed to use the query concrete classes:
    • execute(IMDXQuery) -> execute(MdxQuery).
    • execute(IGetAggregatesQuery) -> execute(GetAggregatesQuery, String).
    • execute(IMapGetAggregatesQuery) -> execute(MapGetAggregatesQuery, String).
    • execute(IDrillthroughHeadersQuery) -> execute(DrillthroughHeadersQuery, String).
    • execute(IMDXDrillthroughHeadersQuery) -> execute(MdxDrillthroughHeadersQuery).
    • execute(IDrillthroughQuery) -> execute(DrillthroughQuery, String).
    • execute(IMapDrillthroughQuery) -> execute(MapDrillthroughQuery, String).
    • execute(IMDXDrillthroughQuery) -> execute(MdxDrillthroughQuery).
  • The generic IStreamingService.createStream() method has been split into different methods to use the query concrete classes:
    • createStream(MdxQuery, IStreamProperties).
    • createStream(MdxDrillthroughQuery, IStreamProperties).
    • createStream(GetAggregatesQuery, String, IStreamProperties).
    • createStream(DrillthroughQuery, String, IStreamProperties).
    • createStream(MapGetAggregatesQuery, String, IStreamProperties).
    • createStream(MapDrillthroughQuery, String, IStreamProperties).
  • The generic IStreamingService.updateStreamQuery() method has been split into different methods to use the query concrete classes:
    • updateStreamQuery(String, String, MdxQuery).
    • updateStreamQuery(String, String, MdxDrillthroughQuery).
    • updateStreamQuery(String, String, GetAggregatesQuery).
    • updateStreamQuery(String, String, DrillthroughQuery).
    • updateStreamQuery(String, String, MapGetAggregatesQuery).
    • updateStreamQuery(String, String, MapDrillthroughQuery).
  • The interface IQuery is no longer generic.
  • IMember#getHierarchyInfo() and IMember#getLevelInfo() are deprecated since 6.2.0 and planned for removal in 6.3.0.
  • To replace getHierarchyInfo(): use getLevelIdentifier() and navigate via LevelIdentifier#getHierarchy() when only an identifier is needed. When full hierarchy metadata is required, look up the hierarchy directly through the cube’s hierarchies.
  • To replace getLevelInfo(): use narrower accessors when only a single attribute is needed. For example, replace getLevelInfo().getOrdinal() with IAxisMember#getLevelOrdinal(), or use getLevelIdentifier() to identify the level. When full level metadata is required, look up the level directly through the cube’s hierarchies.
  • The starter-ai-mcp-server now defaults the MCP transport to Streamable HTTP (spring.ai.mcp.server.protocol=STREAMABLE, served at POST /mcp) instead of the previous Server-Sent Events transport (/sse plus /mcp/messages). This aligns with the MCP specification’s move to Streamable HTTP and is required by current MCP clients such as Claude Code. If you rely on the SSE transport, restore it explicitly:
    spring:
      ai:
        mcp:
          server:
            protocol: SSE
    

Automated OpenRewrite Migration Recipe

The automated OpenRewrite migration recipe handles the following API changes from 6.1.20 to 6.2.0. Run it during the Upgrade step. The recipe is published to JFrog as the artifact com.activeviam.migration:6_1_20-to-6_2_0:<version>, where <version> should be replaced with the latest available version from JFrog.

How to run

From your project root, preview the changes first:
mvn -U org.openrewrite.maven:rewrite-maven-plugin:5.45.0:dryRun \
  -Drewrite.recipeArtifactCoordinates=com.activeviam.migration:6_1_20-to-6_2_0:<version> \
  -Drewrite.activeRecipes=com.activeviam.migration.v6_1_20_to_6_2_20
Then apply them by replacing dryRun with run
mvn -U org.openrewrite.maven:rewrite-maven-plugin:5.45.0:run \
  -Drewrite.recipeArtifactCoordinates=com.activeviam.migration:6_1_20-to-6_2_0:<version> \
  -Drewrite.activeRecipes=com.activeviam.migration.v6_1_20_to_6_2_0

Running a subset of the migration

The aggregator recipe com.activeviam.migration.v6_1_20_to_6_2_0 runs everything. Each migration is split into three phases so you can adopt it gradually. Swap -Drewrite.activeRecipes= for one of the phase recipes instead of the aggregator:
PhaseRecipe nameWhen to run
Beforecom.activeviam.migration.v6_1_20_to_6_2_0_beforeOn the 6.1 code base, before upgrading. The old code still compiles.
Duringcom.activeviam.migration.v6_1_20_to_6_2_0_duringTogether with the upgrade to 6.2. The old code cannot accommodate these changes.
Aftercom.activeviam.migration.v6_1_20_to_6_2_0_afterOnce the project runs on 6.2, to clean up deprecated API usages.

Change of behavior

  • Applications built on the Atoti Spring Boot starter no longer expose the legacy ActivePivot services IAdministrationService and ILicensingService as Spring beans. These services mirror the payloads of the removed SOAP web services, and their information is available through the REST APIs. If your application still injects them, set the atoti.server.service.legacy.enabled property to true to restore them, and please share your use case with ActiveViam: these services are planned for removal in a future version.
  • The query-service monitoring previously provided by the APM module is now built into Atoti Server: query counters are always recorded, and exceptions thrown during query processing are always logged. The single name=QueriesService,type=Monitoring MBean previously registered by the APM module is replaced by two MBeans: name=QueriesServiceStatistics,type=Monitoring (query counters) and name=QueriesServiceLogging,type=Monitoring (runtime logging toggles). The per-query report logs (query/result description, completion time, optional memory statistics) are now disabled by default. If you relied on the APM module to produce these logs, enable them with the atoti.server.query.service.logging=true application property (and optionally atoti.server.query.service.detailed-logging and atoti.server.query.service.log-memory-stats), or at runtime through the QueriesServiceLogging MBean. These logs are now emitted on the atoti.server.query.service logger.
  • Similarly, the JSON queries-service monitoring previously provided by the APM module is now built into Atoti Server: query counters are always recorded, and exceptions thrown during query processing are always logged. The name=JsonQueriesService,type=Monitoring MBean previously registered by the APM module is replaced by name=JsonQueriesServiceStatistics,type=Monitoring (query counters) and name=JsonQueriesServiceLogging,type=Monitoring (runtime logging toggles). The per-query report logs are disabled by default; enable them with the atoti.server.query.service.json.logging=true application property (and optionally atoti.server.query.service.json.detailed-logging and atoti.server.query.service.json.log-memory-stats), or at runtime through the JsonQueriesServiceLogging MBean. The total query counters now correctly include drillthrough queries, which were previously omitted from the totals. These logs are now emitted on the atoti.server.query.service.json logger.
  • Similarly, the streaming-service monitoring previously provided by the APM module is now built into Atoti Server: stream counters are always recorded, and exceptions thrown during stream processing are always logged. The per-query report logs are now disabled by default — note that the APM module previously enabled them by default (activeviam.apm.enable.streaming.service.logging defaulted to true). If you relied on the APM module to produce these logs, enable them with the atoti.server.query.service.streaming.logging=true application property (and optionally atoti.server.query.service.streaming.detailed-logging and atoti.server.query.service.streaming.log-memory-stats), or at runtime through StreamingQueriesServiceLogging MBean. The streaming statistics counters are exposed through the new name=StreamingQueriesServiceStatistics,type=Monitoring MBean. These logs are now emitted on the atoti.server.query.service.streaming logger.
  • The query performance evaluator (adaptive slow-query detection) previously provided by the APM module has been removed: its role is superseded by OpenTelemetry traces and metrics together with the query history module. The query executor performs the (OpenTelemetry-native) monitoring. The activeviam.apm.query.performance.evaluation.{min.sample.size,max.sample.size,coefficient} configuration properties and the com.activeviam.apm.query.slow slow-query logger no longer exist; remove any references to them from your configuration.
  • The APM startup configuration dump has been removed. When the com.activeviam.apm.spring logger was set to DEBUG, the APM module used to log every resolved Spring environment property at startup along with the application classpath. Use Spring Boot’s built-in equivalents instead: the Actuator env and configprops endpoints expose the resolved configuration and sanitize sensitive values out of the box, and starting the application with --debug prints the auto-configuration report.
  • The XMLA monitoring JMX MBean has been renamed from XmlaAPMonitoring to XmlaMonitoring. Update any JMX client, script, or dashboard that references the MBean by name.
  • The node-instance-name logging property has been renamed from activeviam.apm.node.instance.name to atoti.server.node.instance.name, and its default value changed from activepivot to atoti. This property sets the node name shown for the source of each log line (through the LogInstanceConverter Logback converter). Deployments that set the old property must move it to the new key; deployments relying on the default will see the logged node name change from activepivot to atoti.
  • The apm module has been removed; its remaining function is now built into Atoti Server (wired by the atoti-server-starter and the observability plugin). Three behavior changes follow:
    • Thread-status monitoring. The former ThreadsStatusMonitoringBean and its name=ThreadStatus,type=Monitoring JMX MBean (which exposed running/blocked/waiting thread counts) have been removed. Per-state thread counts are available from the standard JVM java.lang:type=Threading MBean or from Micrometer’s JvmThreadMetrics. The passive blocked-thread detection it performed is preserved as a watchdog that logs a full thread dump (built from ThreadDumpUtils) when blocked threads are detected. The watchdog is now disabled by default because the dumps can be verbose; opt in with atoti.server.monitoring.blockedThreadWatchdog.enabled=true. Its scan interval is atoti.server.monitoring.blockedThreadWatchdog.scanIntervalMs (replacing activeviam.apm.jmx.thread.status.cache.timeout). The activeviam.apm.node.starter.jmx.enabled starter property, which used to gate the now-removed JMX beans, no longer exists.
    • Health log category. The watchdog now emits on atoti.server.monitoring.health and atoti.server.monitoring.health.blocked-thread; the legacy com.activeviam.apm.health and com.activeviam.apm.health.blocked-thread names keep working as back-compatibility aliases.
    • Native memory allocator JMX. The DirectChunkAllocator MBean and the activeviam.apm.enable.all.apmanager.statistics property that enabled all its statistics at startup have been removed. The native memory allocator is already exposed by the Atoti starter as the MemoryAllocator MBean; enable its recursive statistics on demand through that MBean if needed.
  • The atoti-server-apm-starter Spring Boot starter has been removed. Its auto-configuration is now part of the main atoti-server-starter: node-instance-name logging is always set up (the activeviam.apm.node.starter.logging.enabled toggle no longer exists), and the blocked-thread watchdog is opt-in via atoti.server.monitoring.blockedThreadWatchdog.enabled.
  • A distributed application can no longer declare several distributing levels that belong to the same hierarchy. Previously the manager description accepted such a configuration with no error, and every entry was kept as an independent distributing level even though the levels of one hierarchy are nested, so the extra level brought no additional partitioning. The configuration is now rejected when the description is validated, raising a DescriptionException. Keep at most one distributing level per hierarchy.
  • A virtual (non-measure) hierarchy whose level resolves to an OBJECT content type without a member name parser now throws a ConfigurationException when the cube is built. Previously this misconfiguration only logged a SEVERE message and let the cube build in a degraded state. To migrate, either define a member name parser on the level (for example via the level builder’s withMemberNameParserPluginKey method, or in the IAxisLevelDescription implementation describing the level) or avoid the OBJECT discriminator.

Removed features

No longer supported

  • IParquetParsingInfo#getSkippedRecordCount() has been removed. It always returned 0.
  • SnowflakeDialectSettings#SnowflakeDialectSettingsBuilder#arrayAggWrapperFunctionName(String) has been removed. The built-in SQL function from Snowflake is now faster.
  • DatabricksDialectSettings#DatabricksDialectSettingsBuilder#xxxNativeArrayUdafName(String) have been removed. Databricks has deprecated the use of Spark UDAFs. Review your database schema to use emulated vectors (multi-row or multi-column) instead.
  • The concealed measures feature has been removed from the distributed data cluster definition. The withConcealedMeasures(...) builder methods, IDataClusterDefinition#getConcealedMeasures/setConcealedMeasures, and the now-redundant withAllMeasures() builder step no longer exist. Remove any call to withAllMeasures() from data cluster definitions; the builder now goes straight from the hierarchy concealment step to branch concealment. Concealing hierarchies and branches remains available.

With alternatives

  • IParquetParsingInfo#getPublishedRecordCount() has been removed. Use getRecordCount() instead.
  • IApplicationDescriptionBuilderWithId#withoutDistributingFields() has been renamed to withoutDistributingLevels().
  • QueryClusterDefinition.DistributedApplicationDefinitionV2 has been renamed to QueryClusterDefinition.DistributedApplicationDefinition.
  • IJdbcSource has been removed. Replace all usages with the concrete JdbcSource class.
  • Deprecated method IQueryExecution#shouldBypassNonJitProviders has been removed. Use IQueryExecution#skipNonJitProviders instead.
  • The BITMAP_PLUGIN_TYPE, JIT_PLUGIN_TYPE and LEAF_PLUGIN_TYPE constants on IBuildableAggregateProviderDescriptionBuilder have been removed. Use the equivalents on IAggregateProviderDefinition.
  • Deprecated method IMultiVersionDistributedActivePivot#unloadMembersFromDataNode has been removed, along with the IMessengerDefinition#UNLOAD_MEMBERS_MESSAGE_TIMEOUT property and the distribution.unload_members_from_data_node.* metrics. Use IMultiVersionDataActivePivot#maskMembers instead.
  • Deprecated method IMultiVersionDistributedActivePivot#getDistributedApplicationInformation() has been removed. Use getApplicationNames() instead, which returns only the distributed application names and not the per-application distributing levels.
  • The Maven modules com.activeviam.activepivot:activepivot-impl and com.activeviam.activepivot:activepivot-intf have been merged into com.activeviam.activepivot:core, use it directly.
  • The Maven modules com.activeviam.activepivot:activepivot-server-impl and com.activeviam.activepivot:activepivot-server-intf have been merged into com.activeviam.activepivot:server, use it directly.
  • The empty Maven module com.activeviam.activepivot:activepivot-copper has been removed. Import com.activeviam.activepivot:core and optionally com.activeviam.activepivot:activepivot-dist-impl instead.
  • The empty Maven module com.activeviam.activepivot:activepivot-ext has been removed. Import com.activeviam.activepivot:core and optionally com.activeviam.activepivot:activepivot-dist-impl instead.
  • The empty Maven module com.activeviam.springboot:atoti-runtime-starter, kept as an alias since it was renamed in 6.1, has been removed. Use com.activeviam.springboot:atoti-server-application-starter instead.
  • Memory sampling (activated via the property “activeviam.mmap.tracking”, and triggered via JMX operations) has been removed. You should now rely on a JFR instead of JMX operations, as those include dedicated JFR events for memory operations. The associated properties “activeviam.mmap.sampling.depth”, “activeviam.mmap.sampling.start” and “activeviam.mmap.sampling.percent” have been removed.
  • MDXQuery is now immutable and the constructors should be used.
  • MDXDrillthroughHeadersQuery is now immutable and the constructors should be used.
  • The deprecated IFieldDescription accessors have been removed:
    • IFieldDescription#isNullable()IFieldDescription#getType().isNullable()
    • IFieldDescription#supportEmptyString()IFieldDescription#getType().supportEmptyString()
    • IFieldDescription#getDefault()IFieldDescription#getType().getDefaultValue()
    • IFieldDescription#getContentClass()IFieldDescription#getType().getDataClass()
  • The activeviam.jwt.* application properties, deprecated since 6.1, have been removed. Use the atoti.jwt.* equivalents instead.
Previous nameNew name
activeviam.jwt.expirationatoti.jwt.expiration
activeviam.jwt.key.privateatoti.jwt.key.private
activeviam.jwt.key.publicatoti.jwt.key.public
activeviam.jwt.claim_key.authoritiesatoti.jwt.claim_key.authorities
activeviam.jwt.claim_key.principalatoti.jwt.claim_key.principal
activeviam.jwt.enabledatoti.jwt.enabled
activeviam.jwt.check_user_detailsatoti.jwt.check_user_details
The expiration property is now a Spring Duration. The available formats are described in Spring’s documentation. For this property, a unitless integer will represent Seconds. In 6.1, a unitless integer would represent:
  • milliseconds for atoti.jwt.expiration
  • seconds for activeviam.jwt.expiration
If you’re migrating to 6.2 and just changed from activeviam.jwt.expiration: int to atoti.jwt.expiration: int, you need to modify that value accordingly. Adding the unit suffix, such as atoti.jwt.expiration: 12000s is the safest way to configure this property.
  • The deprecated ActiveViam Property activeviam.contentService.nameGenerator.defaultSize has been removed, use activeviam.contentService.nameGenerator.size instead. See the Properties page for its definition.
  • Deprecated method StartBuilding.Builder#withEpochManager(IEpochManager) has been removed. Use StartBuilding.Builder#withEpochPolicy(IEpochManagementPolicy) instead, passing the epoch policy directly rather than wrapping it in an EpochManager.
  • Deprecated method PersistedBuilder#lockOptions(boolean) has been removed. Use PersistedBuilder#databaseLocks(LockOptions) instead. lockOptions(true) becomes databaseLocks(LockOptions.defaultOptions()) and lockOptions(false) needs no call.
  • The deprecated duplicate types under io.atoti.runtime.api.measures and io.atoti.server.common.api.plugins have been removed. Use the identically named types under com.activeviam.atoti.application.api.measures and com.activeviam.atoti.server.common.api.plugins. The automated recipe rewrites these package references.
  • The deprecated 4-argument constructor of ActivePivotTransactionCommittedEvent has been removed. Use the 6-argument constructor, passing -1, -1 for the start and commit timings when they are unknown.
  • The deprecated IGenericAggregationFunction.SUM_PRODUCT_FUNCTION_PLUGIN_KEY constant has been removed. Use IMultiSourceAggregationFunction.SUM_PRODUCT_FUNCTION_PLUGIN_KEY instead, which is the canonical home for the multi-source sum-product key. The automated recipe rewrites these references.
  • The deprecated integer and integer[] parser type keys (including sized and delimited variants such as integer[10] and integer[][:]) are no longer recognized. Replace them with the canonical int and int[] (and their sized and delimited variants).
  • The public method ICanBuildCommonCubeDescription#withQueryExecutor() has been removed. The cube’s query executor can no longer be replaced through the builder. To observe the query lifecycle, subscribe to the ActivePivotQueryStarted and ActivePivotQueryDone health events. Both events carry the query task identifier, a top-level flag, and the user name and roles. To cancel an in-flight query, pass the task identifier to the Query REST API V10 killQueryById endpoint.
  • Three deprecated members of AAdvancedPostProcessor have been removed:
    • The OUTPUT_TYPE constant → use IPostProcessor.OUTPUT_TYPE_PROPERTY instead.
    • The protected getLevel(String) method → call HierarchiesUtil.getLevel(getActivePivot(), levelDescription) instead.
    • The protected getHierarchy(String) method → call HierarchiesUtil.getHierarchy(getActivePivot(), hierarchyDescription) instead.
    These methods were only thin delegations to HierarchiesUtil. The automated recipe rewrites both the constant reference and the calls inside your AAdvancedPostProcessor subclasses.
  • The deprecated IDatastoreSchemaDescription accessors have been removed:
    • IDatastoreSchemaDescription#getStoreDescriptions()IDatastoreSchemaDescription#getTables()
    • IDatastoreSchemaDescription#getReferenceDescriptions()IDatastoreSchemaDescription#getJoins()
  • The deprecated IReferenceDescription accessors have been removed:
    • IReferenceDescription#getOwnerStore()IReferenceDescription#getSourceTableName()
    • IReferenceDescription#getTargetStore()IReferenceDescription#getTargetTableName()
  • The deprecated IStoreDescription#getKeyFields() accessor has been removed. Use IStoreDescription#getKeyFieldNames() instead.
  • The deprecated constructors of ReferenceDescription taking field mappings as a List<? extends IPair<String, String>> have been removed. Use the constructor taking a Set<ITableJoin.FieldMapping> instead.
  • The deprecated StoreDescription(String, Collection<String>, List<? extends IFieldDescription>) constructor has been removed. Use StoreDescription.builder() or StoreDescription.simpleBuilder() instead.
  • The deprecated QueryExecution(Boolean) constructor has been removed. Use QueryExecution.builder() instead.

API syntax changes

  • CsvParserConfiguration constructors are replaced by a new builder:
    • new CsvParserConfiguration()CsvParserConfiguration.builder().withColumnCount(0).build()
    • new CsvParserConfiguration(int)CsvParserConfiguration.builder().withColumnCount(n).build()
    • new CsvParserConfiguration(List<String>)CsvParserConfiguration.builder().withColumnNames(names).build()
    • new CsvParserConfiguration(Map<Integer, String>)CsvParserConfiguration.builder().withColumnNamesMapping(map).build()
    • Full constructors (7-param and 8-param) are migrated using the builder.
    • Setter calls (e.g. config.setSeparator(';')) are replaced by the corresponding builder methods (e.g. .separator(';')).
    • createCharset method has been removed
  • The ActivePivotQueryStarted and ActivePivotQueryDone constructors take new required parameters for the query task identifier and the top-level flag. Atoti builds these events internally, so update any code that instantiates them directly.

Mutable configuration passed as method argument

The OpenRewrite recipe cannot correctly migrate setter calls on a configuration object received as a method parameter. For example:
// Before
void configure(ICsvParserConfiguration config) {
    config.setSeparator(';');
}
The recipe will produce:
// After (INCORRECT — the new object is never returned or used)
void configure(CsvParserConfiguration config) {
    config = config.toBuilder().separator(';').build();
}
Because these configuration classes are now immutable, the reassignment to the local variable has no effect on the caller. Review such methods manually and refactor them to return the updated configuration instead:
// Correct
CsvParserConfiguration configure(CsvParserConfiguration config) {
    return config.toBuilder().separator(';').build();
}
  • CsvSourceFactory.create() static methods are replaced by ICsvSource.builder():
    • CsvSourceFactory.create()ICsvSource.builder().build()
    • CsvSourceFactory.create(name)ICsvSource.builder().name(name).build()
    • CsvSourceFactory.create(closeCallback)ICsvSource.builder().closeCallback(closeCallback).build()
    • CsvSourceFactory.create(name, closeCallback)ICsvSource.builder().name(name).closeCallback(closeCallback).build()
  • The ICsvParserConfiguration interface has been removed; replace all usages (return types, variable declarations, and parameter types) with the concrete CsvParserConfiguration class.
  • The IFileParserConfiguration interface has been removed; replace all usages (return types, variable declarations, and parameter types) with the concrete CsvParserConfiguration class.
  • The concrete FileParserConfiguration class has been removed; replace all usages (return types, variable declarations, and parameter types) with the concrete CsvParserConfiguration class.
  • CsvSourceConfiguration and CsvSourceConfigurationBuilder constructors are replaced by the builder:
    • new CsvSourceConfiguration(int, int, boolean, IComparator)CsvSourceConfiguration.builder().parserThreads(t).bufferSize(b).synchronousMode(s).fileComparator(c).build()
    • new CsvSourceConfigurationBuilder()CsvSourceConfiguration.builder()
    • CsvSourceConfigurationBuilder.DEFAULT_PARSER_THREADS is deprecated; use CsvSourceConfiguration.getDefaultParserThreads() instead.
  • The ICsvSourceConfiguration interface has been removed; replace all usages (return types, variable declarations, and parameter types) with the concrete CsvSourceConfiguration class.
  • SnowflakeProperties#SnowflakePropertiesBuilder#additionalOption(SFSession, String) is replaced by SnowflakeProperties#SnowflakePropertiesBuilder#additionalOption(String, String). Inline the former call using SFSession#getPropertyKey().
  • IParquetReaderFactory#create(InputFile, ReadSupport<IParquetRecord>, Configuration) is replaced by IParquetReaderFactory#create(InputFile, ReadSupport<IParquetRecord>, ParquetConfiguration). Wrap the former Configuration argument using new HadoopParquetConfiguration(configuration).
  • The three IParquetParser#parse overloads that take a Hadoop org.apache.hadoop.fs.Path have been removed:
    • parse(org.apache.hadoop.fs.Path, IStoreToParquetMapping, IStoreToParquetMapping...)parse(java.nio.file.Path, IStoreToParquetMapping, IStoreToParquetMapping...)
    • parse(org.apache.hadoop.fs.Path, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...)parse(java.nio.file.Path, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...)
    • parse(org.apache.hadoop.fs.Path, Configuration, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...)parse(java.nio.file.Path, ParquetConfiguration, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...). Wrap the former Hadoop Configuration argument with new HadoopParquetConfiguration(configuration).
  • The factory parameter type in four IParquetParser#parse overloads changed from Function<ICloudEntityPath<EntityT>, ? extends SeekableByteChannel> to ICloudEntityChannelFactory<EntityT>. The affected overloads are:
    • parse(ICloudDirectory<EntityT>, Function<ICloudEntityPath<EntityT>, ? extends SeekableByteChannel>, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...)
    • parse(ICloudDirectory<EntityT>, ParquetConfiguration, Function<ICloudEntityPath<EntityT>, ? extends SeekableByteChannel>, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...)
    • parse(ICloudEntityPath<EntityT>, Function<ICloudEntityPath<EntityT>, ? extends SeekableByteChannel>, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...)
    • parse(ICloudEntityPath<EntityT>, ParquetConfiguration, Function<ICloudEntityPath<EntityT>, ? extends SeekableByteChannel>, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...)
  • ICloudEntityPath#getLastModifiedTime() now returns a java.time.Instant instead of a java.util.Date. The value is still the object’s last-modification instant (UTC). Convert with instant.toEpochMilli() where you previously called date.getTime(), or with Date.from(instant) if you need a Date.
  • IAgent no longer extends IExtendedPluginValue. Implementations of IAgent should now also explicitly implement IExtendedPluginValue if needed.
  • The three Logback conversion-rule converters have been moved out of the apm module into dedicated logging artifacts. Update the fully-qualified class names referenced in your logback.xml/logback-spring.xml <conversionRule> declarations:
    • com.activeviam.apm.api.logging.LogInstanceConvertercom.activeviam.tech.logging.logback.api.LogInstanceConverter (artifact com.activeviam.tech:logging-logback-utils)
    • com.activeviam.apm.api.logging.LogThreadConvertercom.activeviam.tech.logging.logback.api.LogThreadConverter (artifact com.activeviam.tech:logging-logback-utils)
    • com.activeviam.apm.api.logging.LogUserConvertercom.activeviam.tech.logging.logback.spring.api.LogUserConverter (artifact com.activeviam.tech:logging-logback-spring)
  • The IMultiVersionDataActivePivot interface has been moved from package com.activeviam.activepivot.dist.impl.api.cube to com.activeviam.activepivot.dist.datanode.impl.api.cube.
  • NoTransactionException has been moved in the public API, from package com.activeviam.database.datastore.internal to com.activeviam.database.datastore.api.transaction.
  • The IMapQuery, IMapDrillthroughQuery and IMapGetAggregatesQuery interfaces have been removed from public API; replace all usages (return types, variable declarations, and parameter types) with the concrete MapDrillthroughQuery or MapGetAggregatesQuery classes.
    • getPivotId() method and all the setters of the concrete classes have been removed
    • IMapDrillthroughQuery.builder() has been moved to MapDrillthroughQuery.builder().
    • MapDrillthroughQueryBuilder#pivotId(String) has been removed
    • MapDrillthroughQuery#getIsFormatted() has been renamed MapDrillthroughQuery#isFormatted()
  • The IDrillthroughHeadersQuery interface has been moved to an internal package; replace all usages (return types, variable declarations, and parameter types) with the concrete DrillthroughHeadersQuery class. In addition, the methods getFirstResult(), setFirstResult(int), getMaxResults(), setMaxResults(int) have been removed; they had no effect on the results.
  • The IMDXQuery interface has been moved to an internal package; replace all usages (return types, variable declarations, and parameter types) with the concrete MDXQuery class.
  • The IMDXDrillthroughHeadersQuery interface has been moved to an internal package; replace all usages (return types, variable declarations, and parameter types) with the concrete MDXDrillthroughHeadersQuery class. In addition, the methods getFirstResult(), setFirstResult(int), getMaxResults(), setMaxResults(int) have been removed; they had no effect on the results.
  • The IMDXDrillthroughQuery interface has been moved to an internal package; replace all usages (return types, variable declarations, and parameter types) with the concrete MDXDrillthroughQuery class. The method getContent() has been renamed getMdx(); the setters have been removed as the class is now immutable.
  • The IGetAggregatesQuery interface has been moved to an internal package; replace all usages (return types, variable declarations, and parameter types) with the concrete GetAggregatesQuery class. In addition, getPivotId(), the builder’s pivotId() method, and all the setters have been removed.
  • The IDrillthroughQuery interface has been moved to an internal package; replace all usages (return types, variable declarations, and parameter types) with the concrete DrillthroughQuery class.
  • GetAggregatesQuery constructors are replaced by GetAggregatesQuery.builder(). Use the builder methods corresponding to the fields you were passing to the constructor, then call .build().
  • DrillthroughQuery constructors are replaced by DrillthroughQuery.builder(). Use the builder methods corresponding to the fields you were passing to the constructor, then call .build().
  • MDXQuery, MDXDrillthroughQuery and MDXDrillthroughHeadersQuery have been moved to package com.activeviam.activepivot.core.api.query, and renamed to MdxQuery, MdxDrillthroughQuery and MdxDrillthroughHeadersQuery.