From 072d3e257bbf5735d735221816b468e97f314e2e Mon Sep 17 00:00:00 2001 From: Gavin King Date: Fri, 4 Oct 2024 21:26:06 +0200 Subject: [PATCH] miscellaneous code cleanups and refactoring --- .../SessionFactoryOptionsBuilder.java | 109 +++++----- .../env/internal/JdbcEnvironmentImpl.java | 188 ++++++++++-------- .../hibernate/query/sqm/internal/SqmUtil.java | 1 - ...sticalLoggingSessionEventListenerTest.java | 10 +- 4 files changed, 156 insertions(+), 152 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java index ba40caa8b5..cefc1b58a6 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java @@ -68,8 +68,6 @@ import org.hibernate.resource.jdbc.spi.StatementInspector; import org.hibernate.resource.transaction.spi.TransactionCoordinatorBuilder; import org.hibernate.stat.Statistics; import org.hibernate.type.format.FormatMapper; -import org.hibernate.type.format.jackson.JacksonIntegration; -import org.hibernate.type.format.jakartajson.JakartaJsonIntegration; import org.hibernate.type.format.jaxb.JaxbXmlFormatMapper; import jakarta.persistence.criteria.Nulls; @@ -142,6 +140,9 @@ import static org.hibernate.internal.util.config.ConfigurationHelper.getBoolean; import static org.hibernate.internal.util.config.ConfigurationHelper.getInt; import static org.hibernate.internal.util.config.ConfigurationHelper.getInteger; import static org.hibernate.internal.util.config.ConfigurationHelper.getString; +import static org.hibernate.type.format.jackson.JacksonIntegration.getJsonJacksonFormatMapperOrNull; +import static org.hibernate.type.format.jackson.JacksonIntegration.getXMLJacksonFormatMapperOrNull; +import static org.hibernate.type.format.jakartajson.JakartaJsonIntegration.getJakartaJsonBFormatMapperOrNull; /** * In-flight state of {@link SessionFactoryOptions} during {@link org.hibernate.boot.SessionFactoryBuilder} @@ -648,10 +649,7 @@ public class SessionFactoryOptionsBuilder implements SessionFactoryOptions { private boolean disallowBatchUpdates(Dialect dialect, ExtractedDatabaseMetaData meta) { final Boolean dialectAnswer = dialect.supportsBatchUpdates(); - if ( dialectAnswer != null ) { - return !dialectAnswer; - } - return !meta.supportsBatchUpdates(); + return dialectAnswer != null ? !dialectAnswer : !meta.supportsBatchUpdates(); } @SuppressWarnings("unchecked") @@ -759,19 +757,20 @@ public class SessionFactoryOptionsBuilder implements SessionFactoryOptions { if ( isEmpty( producerName ) ) { return null; } - - //noinspection Convert2Lambda - return strategySelector.resolveDefaultableStrategy( - HqlTranslator.class, - producerName, - new Callable<>() { - @Override - public HqlTranslator call() throws Exception { - return (HqlTranslator) serviceRegistry.requireService( ClassLoaderService.class ) - .classForName( producerName ).newInstance(); + else { + //noinspection Convert2Lambda + return strategySelector.resolveDefaultableStrategy( + HqlTranslator.class, + producerName, + new Callable<>() { + @Override + public HqlTranslator call() throws Exception { + return (HqlTranslator) serviceRegistry.requireService( ClassLoaderService.class ) + .classForName( producerName ).newInstance(); + } } - } - ); + ); + } } private SqmTranslatorFactory resolveSqmTranslator( @@ -780,21 +779,20 @@ public class SessionFactoryOptionsBuilder implements SessionFactoryOptions { if ( isEmpty( translatorImplFqn ) ) { return null; } - - return strategySelector.resolveStrategy( - SqmTranslatorFactory.class, - translatorImplFqn - ); + else { + return strategySelector.resolveStrategy( + SqmTranslatorFactory.class, + translatorImplFqn + ); + } } private static Interceptor determineInterceptor( Map configurationSettings, StrategySelector strategySelector) { - Object setting = configurationSettings.get( INTERCEPTOR ); - return strategySelector.resolveStrategy( Interceptor.class, - setting + configurationSettings.get( INTERCEPTOR ) ); } @@ -811,8 +809,7 @@ public class SessionFactoryOptionsBuilder implements SessionFactoryOptions { return (Supplier) setting; } else if ( setting instanceof Class ) { - Class clazz = (Class) setting; - return interceptorSupplier( clazz ); + return interceptorSupplier( (Class) setting ); } else { return interceptorSupplier( @@ -839,15 +836,12 @@ public class SessionFactoryOptionsBuilder implements SessionFactoryOptions { private PhysicalConnectionHandlingMode interpretConnectionHandlingMode( Map configurationSettings, StandardServiceRegistry serviceRegistry) { - final PhysicalConnectionHandlingMode specifiedHandlingMode = PhysicalConnectionHandlingMode.interpret( - configurationSettings.get( CONNECTION_HANDLING ) - ); - - if ( specifiedHandlingMode != null ) { - return specifiedHandlingMode; - } - - return serviceRegistry.requireService( TransactionCoordinatorBuilder.class ).getDefaultConnectionHandlingMode(); + final PhysicalConnectionHandlingMode specifiedHandlingMode = + PhysicalConnectionHandlingMode.interpret( configurationSettings.get( CONNECTION_HANDLING ) ); + return specifiedHandlingMode != null + ? specifiedHandlingMode + : serviceRegistry.requireService( TransactionCoordinatorBuilder.class ) + .getDefaultConnectionHandlingMode(); } private static FormatMapper determineJsonFormatMapper(Object setting, StrategySelector strategySelector) { @@ -855,13 +849,8 @@ public class SessionFactoryOptionsBuilder implements SessionFactoryOptions { FormatMapper.class, setting, (Callable) () -> { - final FormatMapper jsonJacksonFormatMapper = JacksonIntegration.getJsonJacksonFormatMapperOrNull(); - if (jsonJacksonFormatMapper != null) { - return jsonJacksonFormatMapper; - } - else { - return JakartaJsonIntegration.getJakartaJsonBFormatMapperOrNull(); - } + final FormatMapper jsonJacksonFormatMapper = getJsonJacksonFormatMapperOrNull(); + return jsonJacksonFormatMapper != null ? jsonJacksonFormatMapper : getJakartaJsonBFormatMapperOrNull(); } ); } @@ -871,11 +860,8 @@ public class SessionFactoryOptionsBuilder implements SessionFactoryOptions { FormatMapper.class, setting, (Callable) () -> { - final FormatMapper jacksonFormatMapper = JacksonIntegration.getXMLJacksonFormatMapperOrNull(); - if (jacksonFormatMapper != null) { - return jacksonFormatMapper; - } - return new JaxbXmlFormatMapper(); + final FormatMapper jacksonFormatMapper = getXMLJacksonFormatMapperOrNull(); + return jacksonFormatMapper != null ? jacksonFormatMapper : new JaxbXmlFormatMapper(); } ); } @@ -1393,7 +1379,7 @@ public class SessionFactoryOptionsBuilder implements SessionFactoryOptions { } public void addSessionFactoryObservers(SessionFactoryObserver... observers) { - Collections.addAll( this.sessionFactoryObserverList, observers ); + Collections.addAll( sessionFactoryObserverList, observers ); } public void applyInterceptor(Interceptor interceptor) { @@ -1401,13 +1387,14 @@ public class SessionFactoryOptionsBuilder implements SessionFactoryOptions { } public void applyStatelessInterceptor(Class statelessInterceptorClass) { - this.applyStatelessInterceptorSupplier( + applyStatelessInterceptorSupplier( () -> { try { return statelessInterceptorClass.newInstance(); } catch (InstantiationException | IllegalAccessException e) { - throw new HibernateException( String.format( "Could not supply stateless Interceptor of class %s", statelessInterceptorClass.getName()), e ); + throw new HibernateException( "Could not supply stateless Interceptor of class '" + + statelessInterceptorClass.getName() + "'", e ); } } ); @@ -1563,10 +1550,10 @@ public class SessionFactoryOptionsBuilder implements SessionFactoryOptions { } public void applySqlFunction(String registrationName, SqmFunctionDescriptor sqlFunction) { - if ( this.sqlFunctions == null ) { - this.sqlFunctions = new HashMap<>(); + if ( sqlFunctions == null ) { + sqlFunctions = new HashMap<>(); } - this.sqlFunctions.put( registrationName, sqlFunction ); + sqlFunctions.put( registrationName, sqlFunction ); } public void allowOutOfTransactionUpdateOperations(boolean allow) { @@ -1582,11 +1569,12 @@ public class SessionFactoryOptionsBuilder implements SessionFactoryOptions { } private MutableJpaCompliance mutableJpaCompliance() { - if ( !(this.jpaCompliance instanceof MutableJpaCompliance) ) { + if ( jpaCompliance instanceof MutableJpaCompliance mutableJpaCompliance ) { + return mutableJpaCompliance; + } + else { throw new IllegalStateException( "JpaCompliance is no longer mutable" ); } - - return (MutableJpaCompliance) this.jpaCompliance; } public void enableJpaTransactionCompliance(boolean enabled) { @@ -1627,10 +1615,9 @@ public class SessionFactoryOptionsBuilder implements SessionFactoryOptions { } public SessionFactoryOptions buildOptions() { - if ( this.jpaCompliance instanceof MutableJpaCompliance ) { - this.jpaCompliance = mutableJpaCompliance().immutableCopy(); + if ( jpaCompliance instanceof MutableJpaCompliance ) { + jpaCompliance = mutableJpaCompliance().immutableCopy(); } - return this; } } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentImpl.java index 1b7468b6af..70dd6513a4 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentImpl.java @@ -81,27 +81,13 @@ public class JdbcEnvironmentImpl implements JdbcEnvironment { this.sqlExceptionHelper = buildSqlExceptionHelper( dialect, logWarnings( cfgService, dialect ) ); - final IdentifierHelperBuilder identifierHelperBuilder = IdentifierHelperBuilder.from( this ); - identifierHelperBuilder.setGloballyQuoteIdentifiers( globalQuoting( cfgService ) ); - identifierHelperBuilder.setSkipGlobalQuotingForColumnDefinitions( globalQuotingSkippedForColumnDefinitions( - cfgService ) ); - identifierHelperBuilder.setAutoQuoteKeywords( autoKeywordQuoting( cfgService ) ); - identifierHelperBuilder.setNameQualifierSupport( nameQualifierSupport ); + final IdentifierHelperBuilder identifierHelperBuilder = + identifierHelperBuilder( cfgService, nameQualifierSupport ); - IdentifierHelper identifierHelper = null; - ExtractedDatabaseMetaDataImpl.Builder dbMetaDataBuilder = new ExtractedDatabaseMetaDataImpl.Builder( this, false, null ); - try { - identifierHelper = dialect.buildIdentifierHelper( identifierHelperBuilder, null ); - dbMetaDataBuilder.setSupportsNamedParameters( dialect.supportsNamedParameters( null ) ); - } - catch (SQLException sqle) { - // should never ever happen - log.debug( "There was a problem accessing DatabaseMetaData in building the JdbcEnvironment", sqle ); - } - if ( identifierHelper == null ) { - identifierHelper = identifierHelperBuilder.build(); - } - this.identifierHelper = identifierHelper; + final ExtractedDatabaseMetaDataImpl.Builder dbMetaDataBuilder = + new ExtractedDatabaseMetaDataImpl.Builder( this, false, null ); + + this.identifierHelper = identifierHelper( dialect, identifierHelperBuilder, dbMetaDataBuilder );; this.extractedMetaDataSupport = dbMetaDataBuilder.build(); @@ -117,12 +103,39 @@ public class JdbcEnvironmentImpl implements JdbcEnvironment { this.lobCreatorBuilder = LobCreatorBuilderImpl.makeLobCreatorBuilder(); } - private static SqlAstTranslatorFactory resolveSqlAstTranslatorFactory(Dialect dialect) { - if ( dialect.getSqlAstTranslatorFactory() != null ) { - return dialect.getSqlAstTranslatorFactory(); - } + private IdentifierHelperBuilder identifierHelperBuilder( + ConfigurationService cfgService, NameQualifierSupport nameQualifierSupport) { + final IdentifierHelperBuilder identifierHelperBuilder = IdentifierHelperBuilder.from( this ); + identifierHelperBuilder.setGloballyQuoteIdentifiers( globalQuoting( cfgService ) ); + identifierHelperBuilder.setSkipGlobalQuotingForColumnDefinitions( globalQuotingSkippedForColumnDefinitions( + cfgService ) ); + identifierHelperBuilder.setAutoQuoteKeywords( autoKeywordQuoting( cfgService ) ); + identifierHelperBuilder.setNameQualifierSupport( nameQualifierSupport ); + return identifierHelperBuilder; + } - return new StandardSqlAstTranslatorFactory(); + private static IdentifierHelper identifierHelper( + Dialect dialect, + IdentifierHelperBuilder identifierHelperBuilder, + ExtractedDatabaseMetaDataImpl.Builder dbMetaDataBuilder) { + try { + final IdentifierHelper identifierHelper = dialect.buildIdentifierHelper( identifierHelperBuilder, null ); + dbMetaDataBuilder.setSupportsNamedParameters( dialect.supportsNamedParameters( null ) ); + if ( identifierHelper != null ) { + return identifierHelper; + } + } + catch (SQLException sqle) { + // should never ever happen + log.debug( "There was a problem accessing DatabaseMetaData in building the JdbcEnvironment", sqle ); + } + return identifierHelperBuilder.build(); + } + + private static SqlAstTranslatorFactory resolveSqlAstTranslatorFactory(Dialect dialect) { + return dialect.getSqlAstTranslatorFactory() != null + ? dialect.getSqlAstTranslatorFactory() + : new StandardSqlAstTranslatorFactory(); } private static boolean logWarnings(ConfigurationService cfgService, Dialect dialect) { @@ -170,31 +183,15 @@ public class JdbcEnvironmentImpl implements JdbcEnvironment { this.sqlExceptionHelper = buildSqlExceptionHelper( dialect, false ); - NameQualifierSupport nameQualifierSupport = dialect.getNameQualifierSupport(); - if ( nameQualifierSupport == null ) { - nameQualifierSupport = determineNameQualifierSupport( databaseMetaData ); - } - this.nameQualifierSupport = nameQualifierSupport; + this.nameQualifierSupport = nameQualifierSupport( databaseMetaData, dialect ); - final IdentifierHelperBuilder identifierHelperBuilder = IdentifierHelperBuilder.from( this ); - identifierHelperBuilder.setNameQualifierSupport( nameQualifierSupport ); - IdentifierHelper identifierHelper = null; - try { - identifierHelper = dialect.buildIdentifierHelper( identifierHelperBuilder, databaseMetaData ); - } - catch (SQLException sqle) { - // should never ever happen - log.debug( "There was a problem accessing DatabaseMetaData in building the JdbcEnvironment", sqle ); - } - if ( identifierHelper == null ) { - identifierHelper = identifierHelperBuilder.build(); - } - this.identifierHelper = identifierHelper; + this.identifierHelper = identifierHelper( databaseMetaData, dialect ); - this.extractedMetaDataSupport = new ExtractedDatabaseMetaDataImpl.Builder( this, true, jdbcConnectionAccess ) - .apply( databaseMetaData ) - .setSupportsNamedParameters( databaseMetaData.supportsNamedParameters() ) - .build(); + this.extractedMetaDataSupport = + new ExtractedDatabaseMetaDataImpl.Builder( this, true, jdbcConnectionAccess ) + .apply( databaseMetaData ) + .setSupportsNamedParameters( databaseMetaData.supportsNamedParameters() ) + .build(); this.currentCatalog = null; this.currentSchema = null; @@ -207,6 +204,29 @@ public class JdbcEnvironmentImpl implements JdbcEnvironment { this.lobCreatorBuilder = LobCreatorBuilderImpl.makeLobCreatorBuilder(); } + private IdentifierHelper identifierHelper(DatabaseMetaData databaseMetaData, Dialect dialect) { + final IdentifierHelperBuilder identifierHelperBuilder = IdentifierHelperBuilder.from( this ); + identifierHelperBuilder.setNameQualifierSupport( nameQualifierSupport ); + try { + final IdentifierHelper identifierHelper = + dialect.buildIdentifierHelper( identifierHelperBuilder, databaseMetaData ); + if ( identifierHelper != null ) { + return identifierHelper; + } + } + catch (SQLException sqle) { + // should never ever happen + log.debug( "There was a problem accessing DatabaseMetaData in building the JdbcEnvironment", sqle ); + } + return identifierHelperBuilder.build(); + } + + private NameQualifierSupport nameQualifierSupport(DatabaseMetaData databaseMetaData, Dialect dialect) + throws SQLException { + final NameQualifierSupport nameQualifierSupport = dialect.getNameQualifierSupport(); + return nameQualifierSupport == null ? determineNameQualifierSupport( databaseMetaData ) : nameQualifierSupport; + } + private NameQualifierSupport determineNameQualifierSupport(DatabaseMetaData databaseMetaData) throws SQLException { final boolean supportsCatalogs = databaseMetaData.supportsCatalogsInTableDefinitions(); final boolean supportsSchemas = databaseMetaData.supportsSchemasInTableDefinitions(); @@ -261,36 +281,20 @@ public class JdbcEnvironmentImpl implements JdbcEnvironment { this.sqlExceptionHelper = buildSqlExceptionHelper( dialect, logWarnings( cfgService, dialect ) ); - NameQualifierSupport nameQualifierSupport = dialect.getNameQualifierSupport(); - if ( nameQualifierSupport == null ) { - nameQualifierSupport = determineNameQualifierSupport( databaseMetaData ); - } + NameQualifierSupport nameQualifierSupport = nameQualifierSupport( databaseMetaData, + dialect ); this.nameQualifierSupport = nameQualifierSupport; - final IdentifierHelperBuilder identifierHelperBuilder = IdentifierHelperBuilder.from( this ); - identifierHelperBuilder.setGloballyQuoteIdentifiers( globalQuoting( cfgService ) ); - identifierHelperBuilder.setSkipGlobalQuotingForColumnDefinitions( globalQuotingSkippedForColumnDefinitions( - cfgService ) ); - identifierHelperBuilder.setAutoQuoteKeywords( autoKeywordQuoting( cfgService ) ); - identifierHelperBuilder.setNameQualifierSupport( nameQualifierSupport ); - IdentifierHelper identifierHelper = null; - try { - identifierHelper = dialect.buildIdentifierHelper( identifierHelperBuilder, databaseMetaData ); - } - catch (SQLException sqle) { - // should never ever happen - log.debug( "There was a problem accessing DatabaseMetaData in building the JdbcEnvironment", sqle ); - } - if ( identifierHelper == null ) { - identifierHelper = identifierHelperBuilder.build(); - } - this.identifierHelper = identifierHelper; + final IdentifierHelperBuilder identifierHelperBuilder = + identifierHelperBuilder( cfgService, nameQualifierSupport ); + this.identifierHelper = identifierHelper( dialect, databaseMetaData, identifierHelperBuilder ); - this.extractedMetaDataSupport = new ExtractedDatabaseMetaDataImpl.Builder( this, true, jdbcConnectionAccess ) - .apply( databaseMetaData ) - .setConnectionSchemaName( determineCurrentSchemaName( databaseMetaData, serviceRegistry, dialect ) ) - .setSupportsNamedParameters( dialect.supportsNamedParameters( databaseMetaData ) ) - .build(); + this.extractedMetaDataSupport = + new ExtractedDatabaseMetaDataImpl.Builder( this, true, jdbcConnectionAccess ) + .apply( databaseMetaData ) + .setConnectionSchemaName( determineCurrentSchemaName( databaseMetaData, serviceRegistry, dialect ) ) + .setSupportsNamedParameters( dialect.supportsNamedParameters( databaseMetaData ) ) + .build(); // and that current-catalog and current-schema happen after it this.currentCatalog = identifierHelper.toIdentifier( extractedMetaDataSupport.getConnectionCatalogName() ); @@ -308,25 +312,43 @@ public class JdbcEnvironmentImpl implements JdbcEnvironment { ); } + private static IdentifierHelper identifierHelper( + Dialect dialect, DatabaseMetaData databaseMetaData, IdentifierHelperBuilder identifierHelperBuilder) { + try { + final IdentifierHelper identifierHelper = + dialect.buildIdentifierHelper( identifierHelperBuilder, databaseMetaData ); + if ( identifierHelper != null ) { + return identifierHelper; + } + } + catch (SQLException sqle) { + // should never ever happen + log.debug( "There was a problem accessing DatabaseMetaData in building the JdbcEnvironment", sqle ); + } + return identifierHelperBuilder.build(); + } + public static final String SCHEMA_NAME_RESOLVER = "hibernate.schema_name_resolver"; private String determineCurrentSchemaName( DatabaseMetaData databaseMetaData, ServiceRegistry serviceRegistry, Dialect dialect) { + final Object setting = + serviceRegistry.requireService( ConfigurationService.class ) + .getSettings().get( SCHEMA_NAME_RESOLVER ); final SchemaNameResolver schemaNameResolver; - - final Object setting = serviceRegistry.requireService( ConfigurationService.class ).getSettings().get( - SCHEMA_NAME_RESOLVER ); if ( setting == null ) { schemaNameResolver = dialect.getSchemaNameResolver(); } else { - schemaNameResolver = serviceRegistry.requireService( StrategySelector.class ).resolveDefaultableStrategy( - SchemaNameResolver.class, - setting, - dialect.getSchemaNameResolver() - ); + schemaNameResolver = + serviceRegistry.requireService( StrategySelector.class ) + .resolveDefaultableStrategy( + SchemaNameResolver.class, + setting, + dialect.getSchemaNameResolver() + ); } try { diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmUtil.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmUtil.java index d0f1ecbd89..762e53d8ae 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmUtil.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmUtil.java @@ -43,7 +43,6 @@ import org.hibernate.metamodel.model.domain.SimpleDomainType; import org.hibernate.metamodel.model.domain.SingularPersistentAttribute; import org.hibernate.metamodel.model.domain.internal.EntitySqmPathSource; import org.hibernate.persister.entity.EntityPersister; -import org.hibernate.query.BindableType; import org.hibernate.query.IllegalQueryOperationException; import org.hibernate.query.IllegalSelectQueryException; import org.hibernate.query.Order; diff --git a/hibernate-core/src/test/java/org/hibernate/engine/internal/StatisticalLoggingSessionEventListenerTest.java b/hibernate-core/src/test/java/org/hibernate/engine/internal/StatisticalLoggingSessionEventListenerTest.java index c87ec5b837..e8c9065c69 100644 --- a/hibernate-core/src/test/java/org/hibernate/engine/internal/StatisticalLoggingSessionEventListenerTest.java +++ b/hibernate-core/src/test/java/org/hibernate/engine/internal/StatisticalLoggingSessionEventListenerTest.java @@ -1,16 +1,12 @@ /* - * Hibernate, Relational Persistence for Idiomatic Java - * - * License: GNU Lesser General Public License (LGPL), version 2.1 or later - * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html + * SPDX-License-Identifier: LGPL-2.1-or-later + * Copyright Red Hat Inc. and Hibernate Authors */ package org.hibernate.engine.internal; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.Stream; import org.hibernate.cfg.AvailableSettings; import org.hibernate.internal.CoreMessageLogger; @@ -183,7 +179,7 @@ public class StatisticalLoggingSessionEventListenerTest { // Number of lines assertThat( sessionMetricsLog.lines().count() ) .as( "The StatisticalLoggingSessionEventListener should write a line per metric (" - + numberOfMetrics + " lines) plus a header and a footer (2 lines)" ) + + numberOfMetrics + " lines) plus a header and a footer (2 lines)" ) .isEqualTo( numberOfMetrics + 2 ); // Total time long sumDuration = metricList.stream().map( SessionMetric::getDuration ).mapToLong( Long::longValue ).sum();