diff --git a/spring-context/src/main/java/org/springframework/scheduling/support/PeriodicTrigger.java b/spring-context/src/main/java/org/springframework/scheduling/support/PeriodicTrigger.java index 763611dfe0..71096a8934 100644 --- a/spring-context/src/main/java/org/springframework/scheduling/support/PeriodicTrigger.java +++ b/spring-context/src/main/java/org/springframework/scheduling/support/PeriodicTrigger.java @@ -19,13 +19,13 @@ package org.springframework.scheduling.support; import java.time.Duration; import java.time.Instant; import java.time.temporal.ChronoUnit; -import java.util.Objects; import java.util.concurrent.TimeUnit; import org.springframework.lang.Nullable; import org.springframework.scheduling.Trigger; import org.springframework.scheduling.TriggerContext; import org.springframework.util.Assert; +import org.springframework.util.ObjectUtils; /** * A trigger for periodic task execution. The period may be applied as either @@ -250,7 +250,7 @@ public class PeriodicTrigger implements Trigger { return (this == other || (other instanceof PeriodicTrigger that && this.fixedRate == that.fixedRate && this.period.equals(that.period) && - Objects.equals(this.initialDelay, that.initialDelay))); + ObjectUtils.nullSafeEquals(this.initialDelay, that.initialDelay))); } @Override diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/AbstractJdbcCall.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/AbstractJdbcCall.java index 82a2ad19c1..0121db51c0 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/AbstractJdbcCall.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/AbstractJdbcCall.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,7 +43,7 @@ import org.springframework.util.StringUtils; * Abstract class to provide base functionality for easy stored procedure calls * based on configuration options and database meta-data. * - *

This class provides the base SPI for {@link SimpleJdbcCall}. + *

This class provides the processing arrangement for {@link SimpleJdbcCall}. * * @author Thomas Risberg * @author Juergen Hoeller @@ -453,7 +453,7 @@ public abstract class AbstractJdbcCall { /** * Match the provided in parameter values with registered parameters and * parameters defined via meta-data processing. - * @param args the parameter values provided in a Map + * @param args the parameter values provided as a Map * @return a Map with parameter names and values */ protected Map matchInParameterValuesWithCallParameters(Map args) { diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/AbstractJdbcInsert.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/AbstractJdbcInsert.java index 5d6d83c142..504ee7013b 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/AbstractJdbcInsert.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/AbstractJdbcInsert.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,10 +50,10 @@ import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** - * Abstract class to provide base functionality for easy inserts + * Abstract class to provide base functionality for easy (batch) inserts * based on configuration options and database meta-data. * - *

This class provides the base SPI for {@link SimpleJdbcInsert}. + *

This class provides the processing arrangement for {@link SimpleJdbcInsert}. * * @author Thomas Risberg * @author Juergen Hoeller @@ -409,7 +409,7 @@ public abstract class AbstractJdbcInsert { /** * Delegate method to execute the insert, generating a single key. */ - private Number executeInsertAndReturnKeyInternal(final List values) { + private Number executeInsertAndReturnKeyInternal(List values) { KeyHolder kh = executeInsertAndReturnKeyHolderInternal(values); if (kh.getKey() != null) { return kh.getKey(); @@ -423,11 +423,11 @@ public abstract class AbstractJdbcInsert { /** * Delegate method to execute the insert, generating any number of keys. */ - private KeyHolder executeInsertAndReturnKeyHolderInternal(final List values) { + private KeyHolder executeInsertAndReturnKeyHolderInternal(List values) { if (logger.isDebugEnabled()) { logger.debug("The following parameters are used for call " + getInsertString() + " with: " + values); } - final KeyHolder keyHolder = new GeneratedKeyHolder(); + KeyHolder keyHolder = new GeneratedKeyHolder(); if (this.tableMetaDataContext.isGetGeneratedKeysSupported()) { getJdbcTemplate().update( @@ -455,7 +455,7 @@ public abstract class AbstractJdbcInsert { } Assert.state(getTableName() != null, "No table name set"); - final String keyQuery = this.tableMetaDataContext.getSimpleQueryForGetGeneratedKey( + String keyQuery = this.tableMetaDataContext.getSimpleQueryForGetGeneratedKey( getTableName(), getGeneratedKeyNames()[0]); Assert.state(keyQuery != null, "Query for simulating get generated keys must not be null"); @@ -535,8 +535,8 @@ public abstract class AbstractJdbcInsert { /** * Delegate method that executes a batch insert using the passed-in Maps of parameters. - * @param batch array of Maps with parameter names and values to be used in batch insert - * @return array of number of rows affected + * @param batch maps with parameter names and values to be used in the batch insert + * @return an array of number of rows affected */ @SuppressWarnings("unchecked") protected int[] doExecuteBatch(Map... batch) { @@ -549,9 +549,10 @@ public abstract class AbstractJdbcInsert { } /** - * Delegate method that executes a batch insert using the passed-in {@link SqlParameterSource SqlParameterSources}. - * @param batch array of SqlParameterSource with parameter names and values to be used in insert - * @return array of number of rows affected + * Delegate method that executes a batch insert using the passed-in + * {@link SqlParameterSource SqlParameterSources}. + * @param batch parameter sources with names and values to be used in the batch insert + * @return an array of number of rows affected */ protected int[] doExecuteBatch(SqlParameterSource... batch) { checkCompiled(); @@ -606,7 +607,7 @@ public abstract class AbstractJdbcInsert { * Match the provided in parameter values with registered parameters and parameters * defined via meta-data processing. * @param parameterSource the parameter values provided as a {@link SqlParameterSource} - * @return a Map with parameter names and values + * @return a List of values */ protected List matchInParameterValuesWithInsertColumns(SqlParameterSource parameterSource) { return this.tableMetaDataContext.matchInParameterValuesWithInsertColumns(parameterSource); @@ -615,8 +616,8 @@ public abstract class AbstractJdbcInsert { /** * Match the provided in parameter values with registered parameters and parameters * defined via meta-data processing. - * @param args the parameter values provided in a Map - * @return a Map with parameter names and values + * @param args the parameter values provided as a Map + * @return a List of values */ protected List matchInParameterValuesWithInsertColumns(Map args) { return this.tableMetaDataContext.matchInParameterValuesWithInsertColumns(args); diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/SimpleJdbcCall.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/SimpleJdbcCall.java index f26ea8aee3..c5d946fad4 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/SimpleJdbcCall.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/SimpleJdbcCall.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,7 +47,7 @@ import org.springframework.jdbc.core.namedparam.SqlParameterSource; * any meta-data processing if you want to use parameter names that do not * match what is declared during the stored procedure compilation. * - *

The actual insert is being handled using Spring's {@link JdbcTemplate}. + *

The actual call is being handled using Spring's {@link JdbcTemplate}. * *

Many of the configuration methods return the current instance of the * SimpleJdbcCall in order to provide the ability to chain multiple ones diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/SimpleJdbcInsert.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/SimpleJdbcInsert.java index ce210b39b4..f48fb62d14 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/SimpleJdbcInsert.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/SimpleJdbcInsert.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,17 +26,17 @@ import org.springframework.jdbc.core.namedparam.SqlParameterSource; import org.springframework.jdbc.support.KeyHolder; /** - * A SimpleJdbcInsert is a multithreaded, reusable object providing easy insert + * A SimpleJdbcInsert is a multithreaded, reusable object providing easy (batch) insert * capabilities for a table. It provides meta-data processing to simplify the code - * needed to construct a basic insert statement. All you need to provide is the - * name of the table and a Map containing the column names and the column values. + * needed to construct a basic insert statement. All you need to provide is the name + * of the table and a Map containing the column names and the column values. * *

The meta-data processing is based on the DatabaseMetaData provided by the * JDBC driver. As long as the JDBC driver can provide the names of the columns * for a specified table then we can rely on this auto-detection feature. If that * is not the case, then the column names must be specified explicitly. * - *

The actual insert is handled using Spring's {@link JdbcTemplate}. + *

The actual (batch) insert is handled using Spring's {@link JdbcTemplate}. * *

Many of the configuration methods return the current instance of the * SimpleJdbcInsert to provide the ability to chain multiple ones together @@ -142,8 +142,8 @@ public class SimpleJdbcInsert extends AbstractJdbcInsert implements SimpleJdbcIn return doExecuteAndReturnKeyHolder(parameterSource); } - @Override @SuppressWarnings("unchecked") + @Override public int[] executeBatch(Map... batch) { return doExecuteBatch(batch); } diff --git a/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/DefaultDatabaseClient.java b/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/DefaultDatabaseClient.java index a781664d80..ab5caa746d 100644 --- a/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/DefaultDatabaseClient.java +++ b/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/DefaultDatabaseClient.java @@ -57,15 +57,17 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; /** - * Default implementation of {@link DatabaseClient}. + * The default implementation of {@link DatabaseClient}, + * as created by the static factory method. * * @author Mark Paluch * @author Mingyuan Wu * @author Bogdan Ilchyshyn * @author Simon Baslé * @since 5.3 + * @see DatabaseClient#create(ConnectionFactory) */ -class DefaultDatabaseClient implements DatabaseClient { +final class DefaultDatabaseClient implements DatabaseClient { private final Log logger = LogFactory.getLog(getClass()); @@ -251,11 +253,12 @@ class DefaultDatabaseClient implements DatabaseClient { "Value at index %d must not be null. Use bindNull(…) instead.", index)); Map byIndex = new LinkedHashMap<>(this.byIndex); - if (value instanceof Parameter p) { - byIndex.put(index, p); + if (value instanceof Parameter param) { + byIndex.put(index, param); } - else if (value instanceof org.springframework.r2dbc.core.Parameter p) { - byIndex.put(index, p.hasValue() ? Parameters.in(p.getValue()) : Parameters.in(p.getType())); + else if (value instanceof org.springframework.r2dbc.core.Parameter param) { + Object pv = param.getValue(); + byIndex.put(index, (pv != null ? Parameters.in(pv) : Parameters.in(param.getType()))); } else { byIndex.put(index, Parameters.in(value)); diff --git a/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/NamedParameterUtils.java b/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/NamedParameterUtils.java index a43f3028c5..b1b80ea306 100644 --- a/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/NamedParameterUtils.java +++ b/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/NamedParameterUtils.java @@ -22,7 +22,6 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Set; import java.util.TreeMap; @@ -380,6 +379,7 @@ abstract class NamedParameterUtils { private final int endIndex; ParameterHolder(String parameterName, int startIndex, int endIndex) { + Assert.notNull(parameterName, "Parameter name must not be null"); this.parameterName = parameterName; this.startIndex = startIndex; this.endIndex = endIndex; @@ -398,20 +398,15 @@ abstract class NamedParameterUtils { } @Override - public boolean equals(@Nullable Object o) { - if (this == o) { - return true; - } - if (!(o instanceof ParameterHolder that)) { - return false; - } - return this.startIndex == that.startIndex && this.endIndex == that.endIndex - && Objects.equals(this.parameterName, that.parameterName); + public boolean equals(@Nullable Object other) { + return (this == other || (other instanceof ParameterHolder that && + this.startIndex == that.startIndex && this.endIndex == that.endIndex && + this.parameterName.equals(that.parameterName))); } @Override public int hashCode() { - return Objects.hash(this.parameterName, this.startIndex, this.endIndex); + return this.parameterName.hashCode(); } } diff --git a/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/Parameter.java b/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/Parameter.java index 722b915922..453415b659 100644 --- a/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/Parameter.java +++ b/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/Parameter.java @@ -16,8 +16,6 @@ package org.springframework.r2dbc.core; -import java.util.Objects; - import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -111,20 +109,15 @@ public final class Parameter { @Override - public boolean equals(@Nullable Object obj) { - if (this == obj) { - return true; - } - if (!(obj instanceof Parameter other)) { - return false; - } - return (ObjectUtils.nullSafeEquals(this.value, other.value) && - ObjectUtils.nullSafeEquals(this.type, other.type)); + public boolean equals(@Nullable Object other) { + return (this == other || (other instanceof Parameter that && + ObjectUtils.nullSafeEquals(this.value, that.value) && + ObjectUtils.nullSafeEquals(this.type, that.type))); } @Override public int hashCode() { - return Objects.hash(this.value, this.type); + return ObjectUtils.nullSafeHashCode(this.value) + ObjectUtils.nullSafeHashCode(this.type); } @Override diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java index cde3e32802..854cba139e 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java @@ -62,14 +62,17 @@ import org.springframework.web.util.UriBuilder; import org.springframework.web.util.UriBuilderFactory; /** - * Default implementation of {@link WebClient}. + * The default implementation of {@link WebClient}, + * as created by the static factory methods. * * @author Rossen Stoyanchev * @author Brian Clozel * @author Sebastien Deleuze * @since 5.0 + * @see WebClient#create() + * @see WebClient#create(String) */ -class DefaultWebClient implements WebClient { +final class DefaultWebClient implements WebClient { private static final String URI_TEMPLATE_ATTRIBUTE = WebClient.class.getName() + ".uriTemplate"; @@ -104,9 +107,9 @@ class DefaultWebClient implements WebClient { private final DefaultWebClientBuilder builder; - DefaultWebClient(ExchangeFunction exchangeFunction, @Nullable ExchangeFilterFunction filterFunctions, UriBuilderFactory uriBuilderFactory, - @Nullable HttpHeaders defaultHeaders, @Nullable MultiValueMap defaultCookies, - @Nullable Consumer> defaultRequest, + DefaultWebClient(ExchangeFunction exchangeFunction, @Nullable ExchangeFilterFunction filterFunctions, + UriBuilderFactory uriBuilderFactory, @Nullable HttpHeaders defaultHeaders, + @Nullable MultiValueMap defaultCookies, @Nullable Consumer> defaultRequest, @Nullable Map, Function>> statusHandlerMap, ObservationRegistry observationRegistry, @Nullable ClientRequestObservationConvention observationConvention, DefaultWebClientBuilder builder) { @@ -215,12 +218,10 @@ class DefaultWebClient implements WebClient { @Nullable private Consumer httpRequestConsumer; - DefaultRequestBodyUriSpec(HttpMethod httpMethod) { this.httpMethod = httpMethod; } - @Override public RequestBodySpec uri(String uriTemplate, Object... uriVariables) { attribute(URI_TEMPLATE_ATTRIBUTE, uriTemplate); @@ -338,8 +339,8 @@ class DefaultWebClient implements WebClient { return this; } - @Override @SuppressWarnings("deprecation") + @Override public RequestBodySpec context(Function contextModifier) { this.contextModifier = (this.contextModifier != null ? this.contextModifier.andThen(contextModifier) : contextModifier); @@ -431,8 +432,8 @@ class DefaultWebClient implements WebClient { }); } - @Override @SuppressWarnings("deprecation") + @Override public Mono exchange() { ClientRequestObservationContext observationContext = new ClientRequestObservationContext(); ClientRequest.Builder requestBuilder = initRequestBuilder(); @@ -519,7 +520,6 @@ class DefaultWebClient implements WebClient { private static final StatusHandler DEFAULT_STATUS_HANDLER = new StatusHandler(STATUS_CODE_ERROR, ClientResponse::createException); - private final HttpMethod httpMethod; private final URI uri; @@ -530,9 +530,7 @@ class DefaultWebClient implements WebClient { private final int defaultStatusHandlerCount; - - DefaultResponseSpec( - HttpMethod httpMethod, URI uri, Mono responseMono, + DefaultResponseSpec(HttpMethod httpMethod, URI uri, Mono responseMono, List defaultStatusHandlers) { this.httpMethod = httpMethod; @@ -543,7 +541,6 @@ class DefaultWebClient implements WebClient { this.defaultStatusHandlerCount = this.statusHandlers.size(); } - @Override public ResponseSpec onStatus(Predicate statusCodePredicate, Function> exceptionFunction) { @@ -734,6 +731,7 @@ class DefaultWebClient implements WebClient { } } + private static class ObservationFilterFunction implements ExchangeFilterFunction { private final ClientRequestObservationContext observationContext; @@ -744,8 +742,7 @@ class DefaultWebClient implements WebClient { @Override public Mono filter(ClientRequest request, ExchangeFunction next) { - return next.exchange(request) - .doOnNext(this.observationContext::setResponse); + return next.exchange(request).doOnNext(this.observationContext::setResponse); } }