From 628e80f7e56f91f08e3fe99cdb6fb2704b03e4ce Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Thu, 13 Nov 2025 18:23:21 -0500 Subject: [PATCH] Optimize `new ArrayList()` allocations whenever possible To avoid resizing at runtime, it is better to use `ArrayList` with a predefined size. In some cases it is possible from the context of the list we are creating * Fix typos in Javadocs of the affected classes according to IDE suggestions * Use diamond operators for modern Java in the affected classes * pattern matching expressions for `if` where IDE suggested * Use `switch` in one place instead of `if..else`. Again: good suggestion from IDE * Fix Nullability for the router hierarchy * Have to add "redundant" cast in the `XPathRouter` to make NullAway happy --- .../inbound/AmqpInboundChannelAdapter.java | 6 +- .../amqp/support/DefaultAmqpHeaderMapper.java | 58 +++++++-------- .../ResequencingMessageGroupProcessor.java | 2 +- .../integration/channel/QueueChannel.java | 2 +- .../codec/kryo/CompositeKryoRegistrar.java | 13 ++-- .../codec/kryo/KryoClassListRegistrar.java | 9 ++- .../codec/kryo/KryoClassMapRegistrar.java | 10 ++- .../codec/kryo/KryoRegistrationRegistrar.java | 6 +- .../GlobalChannelInterceptorProcessor.java | 2 +- .../IntegrationComponentScanRegistrar.java | 31 ++++---- .../MessagingAnnotationBeanPostProcessor.java | 5 +- .../dispatcher/PartitionedDispatcher.java | 12 +-- .../dispatcher/UnicastingDispatcher.java | 2 +- ...oadableResourceBundleExpressionSource.java | 2 +- .../graph/CompositeMessageHandlerNode.java | 4 +- .../advice/CacheRequestHandlerAdvice.java | 2 +- ...ntegrationMessageHandlerMethodFactory.java | 2 +- .../mapping/AbstractHeaderMapper.java | 73 +++++++++---------- .../router/AbstractMappingMessageRouter.java | 20 ++--- .../AbstractMessageProcessingRouter.java | 4 +- .../ErrorMessageExceptionTypeRouter.java | 7 +- .../integration/router/HeaderValueRouter.java | 4 +- .../integration/router/PayloadTypeRouter.java | 8 +- .../router/RecipientListRouter.java | 6 +- .../selector/PayloadTypeSelector.java | 9 +-- .../store/AbstractKeyValueMessageStore.java | 9 ++- .../integration/store/MessageGroupQueue.java | 2 +- .../AbstractIntegrationMessageBuilder.java | 2 +- .../support/MutableMessageBuilder.java | 12 ++- .../util/AcceptOnceCollectionFilter.java | 2 +- .../util/AnnotatedMethodFilter.java | 4 +- .../integration/util/UniqueMethodFilter.java | 4 +- .../config/FileListFilterFactoryBean.java | 4 +- .../file/filters/AbstractFileListFilter.java | 8 +- .../AbstractLastModifiedFileListFilter.java | 6 +- ...stractMarkerFilePresentFileListFilter.java | 2 +- .../filters/AbstractRecentFileListFilter.java | 8 +- ...tractRemoteFileStreamingMessageSource.java | 2 +- .../remote/aop/StandardRotationPolicy.java | 7 +- .../AbstractRemoteFileOutboundGateway.java | 13 ++-- .../AbstractInboundFileSynchronizer.java | 6 +- .../inbound/FtpStreamingMessageSource.java | 2 +- .../ftp/outbound/FtpOutboundGateway.java | 2 +- .../HttpRequestHandlingEndpointSupport.java | 6 +- .../http/support/DefaultHttpHeaderMapper.java | 10 +-- .../IntegrationMBeanExportConfiguration.java | 2 +- .../inbound/DefaultMBeanObjectConverter.java | 2 +- .../NotificationListeningMessageProducer.java | 2 +- .../BeanPropertyParameterSource.java | 2 +- .../kafka/inbound/KafkaMessageSource.java | 2 +- ...stractConfigurableMongoDbMessageStore.java | 5 +- .../ConfigurableMongoDbMessageStore.java | 2 +- .../mongodb/store/MongoDbMessageStore.java | 5 +- ...Mqttv5PahoMessageDrivenChannelAdapter.java | 6 +- .../inbound/RedisInboundChannelAdapter.java | 2 +- .../outbound/ExpressionArgumentsStrategy.java | 2 +- .../IntegrationRSocketMessageHandler.java | 5 +- .../inbound/SftpStreamingMessageSource.java | 2 +- .../ResourceKnownHostsServerKeyVerifier.java | 2 +- .../inbound/SmbStreamingMessageSource.java | 2 +- .../smb/outbound/SmbOutboundGateway.java | 2 +- .../support/PassThruSubProtocolHandler.java | 3 +- .../ws/DefaultSoapHeaderMapper.java | 9 +-- .../integration/xml/router/XPathRouter.java | 7 +- .../xmpp/support/DefaultXmppHeaderMapper.java | 16 ++-- 65 files changed, 246 insertions(+), 244 deletions(-) diff --git a/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/inbound/AmqpInboundChannelAdapter.java b/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/inbound/AmqpInboundChannelAdapter.java index ceb59851fbe..b4973b7c247 100644 --- a/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/inbound/AmqpInboundChannelAdapter.java +++ b/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/inbound/AmqpInboundChannelAdapter.java @@ -491,7 +491,7 @@ public void onMessageBatch(List messages, @Nullable Channel channel) { else { converted = convertPayloads(messages, channel); if (BatchMode.EXTRACT_PAYLOADS_WITH_HEADERS.equals(AmqpInboundChannelAdapter.this.batchMode)) { - List> listHeaders = new ArrayList<>(); + List> listHeaders = new ArrayList<>(messages.size()); messages.forEach(msg -> listHeaders.add(AmqpInboundChannelAdapter.this.headerMapper .toHeadersFromRequest(msg.getMessageProperties()))); headers = listHeaders; @@ -553,7 +553,7 @@ public void onMessageBatch(List messages, @Nullable Channel channel) { private @Nullable List> convertMessages(List messages, @Nullable Channel channel) { - List> converted = new ArrayList<>(); + List> converted = new ArrayList<>(messages.size()); try { messages.forEach(message -> converted.add(createMessageFromAmqp(message, channel))); return converted; @@ -574,7 +574,7 @@ public void onMessageBatch(List messages, @Nullable Channel channel) { } private @Nullable List convertPayloads(List messages, @Nullable Channel channel) { - List converted = new ArrayList<>(); + List converted = new ArrayList<>(messages.size()); try { messages.forEach(message -> converted.add(this.converter.fromMessage(message))); return converted; diff --git a/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/support/DefaultAmqpHeaderMapper.java b/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/support/DefaultAmqpHeaderMapper.java index 0630cf38526..cda0eb228e8 100644 --- a/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/support/DefaultAmqpHeaderMapper.java +++ b/spring-integration-amqp/src/main/java/org/springframework/integration/amqp/support/DefaultAmqpHeaderMapper.java @@ -16,7 +16,6 @@ package org.springframework.integration.amqp.support; -import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -62,36 +61,33 @@ */ public class DefaultAmqpHeaderMapper extends AbstractHeaderMapper implements AmqpHeaderMapper { - private static final List STANDARD_HEADER_NAMES = new ArrayList<>(); - - static { - STANDARD_HEADER_NAMES.add(AmqpHeaders.APP_ID); - STANDARD_HEADER_NAMES.add(AmqpHeaders.CLUSTER_ID); - STANDARD_HEADER_NAMES.add(AmqpHeaders.CONTENT_ENCODING); - STANDARD_HEADER_NAMES.add(AmqpHeaders.CONTENT_LENGTH); - STANDARD_HEADER_NAMES.add(AmqpHeaders.CONTENT_TYPE); - STANDARD_HEADER_NAMES.add(AmqpHeaders.CORRELATION_ID); - STANDARD_HEADER_NAMES.add(AmqpHeaders.DELAY); - STANDARD_HEADER_NAMES.add(AmqpHeaders.DELIVERY_MODE); - STANDARD_HEADER_NAMES.add(AmqpHeaders.DELIVERY_TAG); - STANDARD_HEADER_NAMES.add(AmqpHeaders.EXPIRATION); - STANDARD_HEADER_NAMES.add(AmqpHeaders.MESSAGE_COUNT); - STANDARD_HEADER_NAMES.add(AmqpHeaders.MESSAGE_ID); - STANDARD_HEADER_NAMES.add(AmqpHeaders.RECEIVED_DELAY); - STANDARD_HEADER_NAMES.add(AmqpHeaders.RECEIVED_DELIVERY_MODE); - STANDARD_HEADER_NAMES.add(AmqpHeaders.RECEIVED_EXCHANGE); - STANDARD_HEADER_NAMES.add(AmqpHeaders.RECEIVED_ROUTING_KEY); - STANDARD_HEADER_NAMES.add(AmqpHeaders.REDELIVERED); - STANDARD_HEADER_NAMES.add(AmqpHeaders.REPLY_TO); - STANDARD_HEADER_NAMES.add(AmqpHeaders.TIMESTAMP); - STANDARD_HEADER_NAMES.add(AmqpHeaders.TYPE); - STANDARD_HEADER_NAMES.add(AmqpHeaders.USER_ID); - STANDARD_HEADER_NAMES.add(JsonHeaders.TYPE_ID); - STANDARD_HEADER_NAMES.add(JsonHeaders.CONTENT_TYPE_ID); - STANDARD_HEADER_NAMES.add(JsonHeaders.KEY_TYPE_ID); - STANDARD_HEADER_NAMES.add(AmqpHeaders.SPRING_REPLY_CORRELATION); - STANDARD_HEADER_NAMES.add(AmqpHeaders.SPRING_REPLY_TO_STACK); - } + private static final List STANDARD_HEADER_NAMES = + List.of(AmqpHeaders.APP_ID, + AmqpHeaders.CLUSTER_ID, + AmqpHeaders.CONTENT_ENCODING, + AmqpHeaders.CONTENT_LENGTH, + AmqpHeaders.CONTENT_TYPE, + AmqpHeaders.CORRELATION_ID, + AmqpHeaders.DELAY, + AmqpHeaders.DELIVERY_MODE, + AmqpHeaders.DELIVERY_TAG, + AmqpHeaders.EXPIRATION, + AmqpHeaders.MESSAGE_COUNT, + AmqpHeaders.MESSAGE_ID, + AmqpHeaders.RECEIVED_DELAY, + AmqpHeaders.RECEIVED_DELIVERY_MODE, + AmqpHeaders.RECEIVED_EXCHANGE, + AmqpHeaders.RECEIVED_ROUTING_KEY, + AmqpHeaders.REDELIVERED, + AmqpHeaders.REPLY_TO, + AmqpHeaders.TIMESTAMP, + AmqpHeaders.TYPE, + AmqpHeaders.USER_ID, + JsonHeaders.TYPE_ID, + JsonHeaders.CONTENT_TYPE_ID, + JsonHeaders.KEY_TYPE_ID, + AmqpHeaders.SPRING_REPLY_CORRELATION, + AmqpHeaders.SPRING_REPLY_TO_STACK); @SuppressWarnings("this-escape") protected DefaultAmqpHeaderMapper(String @Nullable [] requestHeaderNames, String @Nullable [] replyHeaderNames) { diff --git a/spring-integration-core/src/main/java/org/springframework/integration/aggregator/ResequencingMessageGroupProcessor.java b/spring-integration-core/src/main/java/org/springframework/integration/aggregator/ResequencingMessageGroupProcessor.java index a8d1b06b682..f4421362111 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/aggregator/ResequencingMessageGroupProcessor.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/aggregator/ResequencingMessageGroupProcessor.java @@ -49,7 +49,7 @@ public Object processMessageGroup(MessageGroup group) { if (!messages.isEmpty()) { List> sorted = new ArrayList<>(messages); sorted.sort(this.comparator); - ArrayList> partialSequence = new ArrayList<>(); + ArrayList> partialSequence = new ArrayList<>(messages.size()); int previousSequence = extractSequenceNumber(sorted.get(0)); int currentSequence = previousSequence; for (Message message : sorted) { diff --git a/spring-integration-core/src/main/java/org/springframework/integration/channel/QueueChannel.java b/spring-integration-core/src/main/java/org/springframework/integration/channel/QueueChannel.java index abee763a2c5..59c07c8aead 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/channel/QueueChannel.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/channel/QueueChannel.java @@ -207,8 +207,8 @@ public List> purge(@Nullable MessageSelector selector) { if (selector == null) { return this.clear(); } - List> purgedMessages = new ArrayList<>(); Object[] array = this.queue.toArray(); + List> purgedMessages = new ArrayList<>(array.length); for (Object o : array) { Message message = (Message) o; if (!selector.accept(message) && this.queue.remove(message)) { diff --git a/spring-integration-core/src/main/java/org/springframework/integration/codec/kryo/CompositeKryoRegistrar.java b/spring-integration-core/src/main/java/org/springframework/integration/codec/kryo/CompositeKryoRegistrar.java index a5e24ba45c7..97d8c32602d 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/codec/kryo/CompositeKryoRegistrar.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/codec/kryo/CompositeKryoRegistrar.java @@ -29,6 +29,8 @@ * A {@link KryoRegistrar} that delegates and validates registrations across all components. * * @author David Turanski + * @author Artem Bilan + * * @since 4.2 */ public class CompositeKryoRegistrar extends AbstractKryoRegistrar { @@ -36,7 +38,7 @@ public class CompositeKryoRegistrar extends AbstractKryoRegistrar { private final List delegates; public CompositeKryoRegistrar(List delegates) { - this.delegates = new ArrayList(delegates); + this.delegates = new ArrayList<>(delegates); if (!CollectionUtils.isEmpty(this.delegates)) { validateRegistrations(); @@ -52,7 +54,7 @@ public void registerTypes(Kryo kryo) { @Override public final List getRegistrations() { - List registrations = new ArrayList(); + List registrations = new ArrayList<>(); for (KryoRegistrar registrar : this.delegates) { registrations.addAll(registrar.getRegistrations()); } @@ -60,10 +62,11 @@ public final List getRegistrations() { } private void validateRegistrations() { - List ids = new ArrayList(); - List> types = new ArrayList>(); + List registrations = getRegistrations(); + List ids = new ArrayList<>(registrations.size()); + List> types = new ArrayList<>(registrations.size()); - for (Registration registration : getRegistrations()) { + for (Registration registration : registrations) { Assert.isTrue(registration.getId() >= MIN_REGISTRATION_VALUE, "registration ID must be >= " + MIN_REGISTRATION_VALUE); if (ids.contains(registration.getId())) { diff --git a/spring-integration-core/src/main/java/org/springframework/integration/codec/kryo/KryoClassListRegistrar.java b/spring-integration-core/src/main/java/org/springframework/integration/codec/kryo/KryoClassListRegistrar.java index 46185f95b11..cae3ea8d66e 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/codec/kryo/KryoClassListRegistrar.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/codec/kryo/KryoClassListRegistrar.java @@ -64,17 +64,18 @@ public KryoClassListRegistrar(List> classes) { * @param initialValue the initial value */ public void setInitialValue(int initialValue) { - Assert.isTrue(initialValue >= MIN_REGISTRATION_VALUE, "'initialValue' must be >= " + MIN_REGISTRATION_VALUE); + Assert.isTrue(initialValue >= MIN_REGISTRATION_VALUE, + () -> "'initialValue' must be >= " + MIN_REGISTRATION_VALUE); this.initialValue = initialValue; } @Override public List getRegistrations() { - List registrations = new ArrayList<>(); + List registrations = new ArrayList<>(this.registeredClasses.size()); if (!CollectionUtils.isEmpty(this.registeredClasses)) { for (int i = 0; i < this.registeredClasses.size(); i++) { - registrations.add(new Registration(this.registeredClasses.get(i), - KRYO.getSerializer(this.registeredClasses.get(i)), i + this.initialValue)); + Class type = this.registeredClasses.get(i); + registrations.add(new Registration(type, KRYO.getSerializer(type), i + this.initialValue)); } } return registrations; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/codec/kryo/KryoClassMapRegistrar.java b/spring-integration-core/src/main/java/org/springframework/integration/codec/kryo/KryoClassMapRegistrar.java index 411a2f2ebfd..f91d5692b5b 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/codec/kryo/KryoClassMapRegistrar.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/codec/kryo/KryoClassMapRegistrar.java @@ -30,6 +30,8 @@ * used to explicitly set the registration ID for each class. * * @author David Turanski + * @author Artem Bilan + * * @since 4.2 */ public class KryoClassMapRegistrar extends AbstractKryoRegistrar { @@ -37,16 +39,16 @@ public class KryoClassMapRegistrar extends AbstractKryoRegistrar { private final Map> registeredClasses; public KryoClassMapRegistrar(Map> kryoRegisteredClasses) { - this.registeredClasses = new HashMap>(kryoRegisteredClasses); + this.registeredClasses = new HashMap<>(kryoRegisteredClasses); } @Override public List getRegistrations() { - List registrations = new ArrayList(); + List registrations = new ArrayList<>(this.registeredClasses.size()); if (!CollectionUtils.isEmpty(this.registeredClasses)) { for (Map.Entry> entry : this.registeredClasses.entrySet()) { - registrations.add( - new Registration(entry.getValue(), KRYO.getSerializer(entry.getValue()), entry.getKey())); + Class type = entry.getValue(); + registrations.add(new Registration(type, KRYO.getSerializer(type), entry.getKey())); } } return registrations; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/codec/kryo/KryoRegistrationRegistrar.java b/spring-integration-core/src/main/java/org/springframework/integration/codec/kryo/KryoRegistrationRegistrar.java index fdfe54a99d4..144fd2d09d9 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/codec/kryo/KryoRegistrationRegistrar.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/codec/kryo/KryoRegistrationRegistrar.java @@ -25,6 +25,8 @@ * A {@link KryoRegistrar} implementation backed by a List of {@link Registration}. * * @author David Turanski + * @author Artem Bilan + * * @since 4.2 */ public class KryoRegistrationRegistrar extends AbstractKryoRegistrar { @@ -32,9 +34,7 @@ public class KryoRegistrationRegistrar extends AbstractKryoRegistrar { private final List registrations; public KryoRegistrationRegistrar(List registrations) { - this.registrations = registrations != null - ? new ArrayList(registrations) - : new ArrayList(); + this.registrations = new ArrayList<>(registrations); } @Override diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/GlobalChannelInterceptorProcessor.java b/spring-integration-core/src/main/java/org/springframework/integration/config/GlobalChannelInterceptorProcessor.java index 037418bc101..0a0d23b697f 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/GlobalChannelInterceptorProcessor.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/GlobalChannelInterceptorProcessor.java @@ -120,7 +120,7 @@ public void addMatchingInterceptors(InterceptableChannel channel, String beanNam LOGGER.debug("Applying global interceptors on channel '" + beanName + "'"); } - List tempInterceptors = new ArrayList<>(); + List tempInterceptors = new ArrayList<>(this.positiveOrderInterceptors.size()); this.positiveOrderInterceptors .forEach(interceptorWrapper -> diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/IntegrationComponentScanRegistrar.java b/spring-integration-core/src/main/java/org/springframework/integration/config/IntegrationComponentScanRegistrar.java index 953979895e8..f68d29f24e6 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/IntegrationComponentScanRegistrar.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/IntegrationComponentScanRegistrar.java @@ -76,7 +76,7 @@ public class IntegrationComponentScanRegistrar implements ImportBeanDefinitionRe private static final String BEAN_NAME = IntegrationComponentScanRegistrar.class.getName(); - private final List defaultFilters = new ArrayList<>(); + private final List defaultFilters = List.of(new AnnotationTypeFilter(MessagingGateway.class, true)); @SuppressWarnings("NullAway.Init") private ResourceLoader resourceLoader; @@ -84,10 +84,6 @@ public class IntegrationComponentScanRegistrar implements ImportBeanDefinitionRe @SuppressWarnings("NullAway.Init") private Environment environment; - public IntegrationComponentScanRegistrar() { - this.defaultFilters.add(new AnnotationTypeFilter(MessagingGateway.class, true)); - } - @Override public void setResourceLoader(ResourceLoader resourceLoader) { this.resourceLoader = resourceLoader; @@ -132,7 +128,7 @@ protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) { }; - filter(registry, componentScan, scanner); // NOSONAR - never null + filter(registry, componentScan, scanner); scanner.setResourceLoader(this.resourceLoader); scanner.setEnvironment(this.environment); @@ -151,7 +147,7 @@ protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) { private void filter(BeanDefinitionRegistry registry, AnnotationAttributes componentScan, ClassPathScanningCandidateComponentProvider scanner) { - if (componentScan.getBoolean("useDefaultFilters")) { // NOSONAR - never null + if (componentScan.getBoolean("useDefaultFilters")) { for (TypeFilter typeFilter : this.defaultFilters) { scanner.addIncludeFilter(typeFilter); } @@ -188,10 +184,11 @@ protected Collection getBasePackages(AnnotationAttributes componentScan, } private List typeFiltersFor(AnnotationAttributes filter, BeanDefinitionRegistry registry) { - List typeFilters = new ArrayList<>(); + Class[] classes = filter.getClassArray("classes"); + List typeFilters = new ArrayList<>(classes.length); FilterType filterType = filter.getEnum("type"); - for (Class filterClass : filter.getClassArray("classes")) { + for (Class filterClass : classes) { switch (filterType) { case ANNOTATION -> { Assert.isAssignable(Annotation.class, filterClass, @@ -230,23 +227,23 @@ private static void invokeAwareMethods(Object parserStrategyBean, Environment en ResourceLoader resourceLoader, BeanDefinitionRegistry registry) { if (parserStrategyBean instanceof Aware) { - if (parserStrategyBean instanceof BeanClassLoaderAware) { + if (parserStrategyBean instanceof BeanClassLoaderAware beanClassLoaderAware) { ClassLoader classLoader = registry instanceof ConfigurableBeanFactory ? ((ConfigurableBeanFactory) registry).getBeanClassLoader() : resourceLoader.getClassLoader(); if (classLoader != null) { - ((BeanClassLoaderAware) parserStrategyBean).setBeanClassLoader(classLoader); + beanClassLoaderAware.setBeanClassLoader(classLoader); } } - if (parserStrategyBean instanceof BeanFactoryAware && registry instanceof BeanFactory) { - ((BeanFactoryAware) parserStrategyBean).setBeanFactory((BeanFactory) registry); + if (parserStrategyBean instanceof BeanFactoryAware beanFactoryAware && registry instanceof BeanFactory) { + beanFactoryAware.setBeanFactory((BeanFactory) registry); } - if (parserStrategyBean instanceof EnvironmentAware) { - ((EnvironmentAware) parserStrategyBean).setEnvironment(environment); + if (parserStrategyBean instanceof EnvironmentAware environmentAware) { + environmentAware.setEnvironment(environment); } - if (parserStrategyBean instanceof ResourceLoaderAware) { - ((ResourceLoaderAware) parserStrategyBean).setResourceLoader(resourceLoader); + if (parserStrategyBean instanceof ResourceLoaderAware resourceLoaderAware) { + resourceLoaderAware.setResourceLoader(resourceLoader); } } } diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/MessagingAnnotationBeanPostProcessor.java b/spring-integration-core/src/main/java/org/springframework/integration/config/MessagingAnnotationBeanPostProcessor.java index 99793138a98..dcdbfbfaf92 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/MessagingAnnotationBeanPostProcessor.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/MessagingAnnotationBeanPostProcessor.java @@ -63,7 +63,7 @@ public class MessagingAnnotationBeanPostProcessor private final Map, MethodAnnotationPostProcessor> postProcessors; - private final List methodsToPostProcessAfterContextInitialization = new ArrayList<>(); + private final List methodsToPostProcessAfterContextInitialization; @SuppressWarnings("NullAway.Init") private ConfigurableListableBeanFactory beanFactory; @@ -74,6 +74,7 @@ public MessagingAnnotationBeanPostProcessor( Map, MethodAnnotationPostProcessor> postProcessors) { this.postProcessors = postProcessors; + this.methodsToPostProcessAfterContextInitialization = new ArrayList<>(this.postProcessors.size()); } @Override @@ -217,7 +218,7 @@ public void afterSingletonsInstantiated() { protected static List obtainMessagingAnnotations( Set> postProcessors, MergedAnnotations annotations, String identified) { - List messagingAnnotations = new ArrayList<>(); + List messagingAnnotations = new ArrayList<>(postProcessors.size()); for (Class annotationType : postProcessors) { annotations.stream() diff --git a/spring-integration-core/src/main/java/org/springframework/integration/dispatcher/PartitionedDispatcher.java b/spring-integration-core/src/main/java/org/springframework/integration/dispatcher/PartitionedDispatcher.java index 9cfa5b79b3a..14d443333d6 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/dispatcher/PartitionedDispatcher.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/dispatcher/PartitionedDispatcher.java @@ -58,9 +58,9 @@ */ public class PartitionedDispatcher extends AbstractDispatcher { - private final List partitions = new ArrayList<>(); + private final List partitions; - private final List executors = new ArrayList<>(); + private final List executors; private final int partitionCount; @@ -79,7 +79,7 @@ public class PartitionedDispatcher extends AbstractDispatcher { private final Lock lock = new ReentrantLock(); /** - * Instantiate based on a provided number of partitions and function for partition key against + * Instantiate based on a provided number of partitions and function for a partition key against * the message to dispatch. * @param partitionCount the number of partitions in this channel. * @param partitionKeyFunction the function to resolve a partition key against the message @@ -90,6 +90,8 @@ public PartitionedDispatcher(int partitionCount, Function, Object> pa Assert.notNull(partitionKeyFunction, "'partitionKeyFunction' must not be null"); this.partitionKeyFunction = partitionKeyFunction; this.partitionCount = partitionCount; + this.partitions = new ArrayList<>(partitionCount); + this.executors = new ArrayList<>(partitionCount); } /** @@ -143,7 +145,7 @@ public void setErrorHandler(ErrorHandler errorHandler) { /** * Set a {@link MessageHandlingTaskDecorator} to wrap a message handling task into some - * addition logic, e.g. message channel may provide an interception for its operations. + * addition logic, e.g., a message channel may provide an interception for its operations. * @param messageHandlingTaskDecorator the {@link MessageHandlingTaskDecorator} to use. */ public void setMessageHandlingTaskDecorator(MessageHandlingTaskDecorator messageHandlingTaskDecorator) { @@ -153,7 +155,7 @@ public void setMessageHandlingTaskDecorator(MessageHandlingTaskDecorator message /** * Shutdown this dispatcher on application close. - * The partition executors are shutdown and internal state of this instance is cleared. + * The partition executors are shutdown and the internal state of this instance is cleared. */ public void shutdown() { this.executors.forEach(ExecutorService::shutdown); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/dispatcher/UnicastingDispatcher.java b/spring-integration-core/src/main/java/org/springframework/integration/dispatcher/UnicastingDispatcher.java index 0bd51514e4b..8fe3027815b 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/dispatcher/UnicastingDispatcher.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/dispatcher/UnicastingDispatcher.java @@ -167,7 +167,7 @@ private boolean doDispatch(Message message) { IntegrationUtils.wrapInDeliveryExceptionIfNecessary(message, () -> "Dispatcher failed to deliver Message", ex); if (exceptions == null) { - exceptions = new ArrayList<>(); + exceptions = new ArrayList<>(getHandlerCount()); } exceptions.add(runtimeException); boolean isLast = !handlerIterator.hasNext(); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/expression/ReloadableResourceBundleExpressionSource.java b/spring-integration-core/src/main/java/org/springframework/integration/expression/ReloadableResourceBundleExpressionSource.java index d71a37a2c9c..264f132dcc9 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/expression/ReloadableResourceBundleExpressionSource.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/expression/ReloadableResourceBundleExpressionSource.java @@ -371,7 +371,7 @@ private List calculateAllFilenames(String basename, Locale locale) { * @return the List of filenames to check */ private List calculateFilenamesForLocale(String basename, Locale locale) { - List result = new ArrayList<>(); + List result = new ArrayList<>(3); String language = locale.getLanguage(); String country = locale.getCountry(); String variant = locale.getVariant(); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/graph/CompositeMessageHandlerNode.java b/spring-integration-core/src/main/java/org/springframework/integration/graph/CompositeMessageHandlerNode.java index cb1761bf444..5f0705c568b 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/graph/CompositeMessageHandlerNode.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/graph/CompositeMessageHandlerNode.java @@ -34,13 +34,13 @@ */ public class CompositeMessageHandlerNode extends MessageHandlerNode { - private final List handlers = new ArrayList<>(); + private final List handlers; public CompositeMessageHandlerNode(int nodeId, String name, MessageHandler handler, String input, @Nullable String output, List handlers) { super(nodeId, name, handler, input, output); - this.handlers.addAll(handlers); + this.handlers = new ArrayList<>(handlers); } public List getHandlers() { diff --git a/spring-integration-core/src/main/java/org/springframework/integration/handler/advice/CacheRequestHandlerAdvice.java b/spring-integration-core/src/main/java/org/springframework/integration/handler/advice/CacheRequestHandlerAdvice.java index a8f2effc918..f70cf8db908 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/handler/advice/CacheRequestHandlerAdvice.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/handler/advice/CacheRequestHandlerAdvice.java @@ -91,7 +91,7 @@ public class CacheRequestHandlerAdvice extends AbstractRequestHandlerAdvice private final String @Nullable [] cacheNames; - private final List cacheOperations = new ArrayList<>(); + private final List cacheOperations = new ArrayList<>(3); private Expression keyExpression = new FunctionExpression>(Message::getPayload); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/handler/support/IntegrationMessageHandlerMethodFactory.java b/spring-integration-core/src/main/java/org/springframework/integration/handler/support/IntegrationMessageHandlerMethodFactory.java index ba47db33fe3..d409ccadfd4 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/handler/support/IntegrationMessageHandlerMethodFactory.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/handler/support/IntegrationMessageHandlerMethodFactory.java @@ -93,7 +93,7 @@ public InvocableHandlerMethod createInvocableHandlerMethod(Object bean, Method m } private List buildArgumentResolvers(boolean listCapable) { - List resolvers = new ArrayList<>(); + List resolvers = new ArrayList<>(6); resolvers.add(new PayloadExpressionArgumentResolver()); resolvers.add(new NullAwarePayloadArgumentResolver(this.messageConverter)); resolvers.add(new PayloadsArgumentResolver()); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/mapping/AbstractHeaderMapper.java b/spring-integration-core/src/main/java/org/springframework/integration/mapping/AbstractHeaderMapper.java index 46ba0048faf..99ac13d4688 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/mapping/AbstractHeaderMapper.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/mapping/AbstractHeaderMapper.java @@ -74,9 +74,9 @@ public abstract class AbstractHeaderMapper implements RequestReplyHeaderMappe public static final String NON_STANDARD_HEADER_NAME_PATTERN = "NON_STANDARD_HEADERS"; private static final Collection TRANSIENT_HEADER_NAMES = - Arrays.asList(MessageHeaders.ID, MessageHeaders.TIMESTAMP); + List.of(MessageHeaders.ID, MessageHeaders.TIMESTAMP); - protected final Log logger = LogFactory.getLog(getClass()); // NOSONAR final + protected final Log logger = LogFactory.getLog(getClass()); private final String standardHeaderPrefix; @@ -92,7 +92,7 @@ public abstract class AbstractHeaderMapper implements RequestReplyHeaderMappe /** * Create a new instance. - * @param standardHeaderPrefix the header prefix that identifies standard header. Such prefix helps to + * @param standardHeaderPrefix the header prefix that identifies the standard header. Such a prefix helps to * differentiate user-defined headers from standard headers. If set, user-defined headers are also * mapped by default * @param requestHeaderNames the header names that should be mapped from a request to {@link MessageHeaders} @@ -158,36 +158,35 @@ protected HeaderMatcher createDefaultHeaderMatcher(String standardHeaderPrefix, *

Special patterns are also recognized: {@link #STANDARD_REQUEST_HEADER_NAME_PATTERN}, * {@link #STANDARD_REQUEST_HEADER_NAME_PATTERN} and {@link #NON_STANDARD_HEADER_NAME_PATTERN}. * @param patterns the patterns to apply - * @return a header mapper that match if any of the specified patters match + * @return a header mapper that matches if any of the specified patters match */ protected HeaderMatcher createHeaderMatcher(Collection patterns) { - List matchers = new ArrayList<>(); + List matchers = new ArrayList<>(patterns.size()); for (String pattern : patterns) { - if (STANDARD_REQUEST_HEADER_NAME_PATTERN.equals(pattern)) { - matchers.add(new ContentBasedHeaderMatcher(true, this.requestHeaderNames)); - } - else if (STANDARD_REPLY_HEADER_NAME_PATTERN.equals(pattern)) { - matchers.add(new ContentBasedHeaderMatcher(true, this.replyHeaderNames)); - } - else if (NON_STANDARD_HEADER_NAME_PATTERN.equals(pattern)) { - matchers.add(new PrefixBasedMatcher(false, this.standardHeaderPrefix)); - } - else { - String thePattern = pattern; - boolean negate = false; - if (pattern.startsWith("!")) { - thePattern = pattern.substring(1); - negate = true; - } - else if (pattern.startsWith("\\!")) { - thePattern = pattern.substring(1); - } - if (negate) { - // negative matchers get priority - matchers.add(0, new SinglePatternBasedHeaderMatcher(thePattern, negate)); - } - else { - matchers.add(new SinglePatternBasedHeaderMatcher(thePattern, negate)); + switch (pattern) { + case STANDARD_REQUEST_HEADER_NAME_PATTERN -> + matchers.add(new ContentBasedHeaderMatcher(true, this.requestHeaderNames)); + case STANDARD_REPLY_HEADER_NAME_PATTERN -> + matchers.add(new ContentBasedHeaderMatcher(true, this.replyHeaderNames)); + case NON_STANDARD_HEADER_NAME_PATTERN -> + matchers.add(new PrefixBasedMatcher(false, this.standardHeaderPrefix)); + default -> { + String thePattern = pattern; + boolean negate = false; + if (pattern.startsWith("!")) { + thePattern = pattern.substring(1); + negate = true; + } + else if (pattern.startsWith("\\!")) { + thePattern = pattern.substring(1); + } + if (negate) { + // negative matchers get priority + matchers.add(0, new SinglePatternBasedHeaderMatcher(thePattern, negate)); + } + else { + matchers.add(new SinglePatternBasedHeaderMatcher(thePattern, negate)); + } } } } @@ -485,16 +484,14 @@ private boolean containsIgnoreCase(String name) { */ protected static class PatternBasedHeaderMatcher implements HeaderMatcher { - private static final Log LOGGER = LogFactory.getLog(HeaderMatcher.class); + private static final Log LOGGER = LogFactory.getLog(PatternBasedHeaderMatcher.class); - private final Collection patterns = new ArrayList<>(); + private final Collection patterns; public PatternBasedHeaderMatcher(Collection patterns) { Assert.notNull(patterns, "Patterns must no be null"); Assert.notEmpty(patterns, "At least one pattern must be specified"); - for (String pattern : patterns) { - this.patterns.add(pattern.toLowerCase(Locale.ROOT)); - } + this.patterns = patterns.stream().map((pattern) -> pattern.toLowerCase(Locale.ROOT)).toList(); } @Override @@ -525,7 +522,7 @@ public boolean matchHeader(String headerName) { */ protected static class SinglePatternBasedHeaderMatcher implements HeaderMatcher { - private static final Log LOGGER = LogFactory.getLog(HeaderMatcher.class); + private static final Log LOGGER = LogFactory.getLog(SinglePatternBasedHeaderMatcher.class); private final String pattern; @@ -569,7 +566,7 @@ public boolean isNegated() { */ protected static class PrefixBasedMatcher implements HeaderMatcher { - private static final Log LOGGER = LogFactory.getLog(HeaderMatcher.class); + private static final Log LOGGER = LogFactory.getLog(PrefixBasedMatcher.class); private final boolean match; @@ -604,7 +601,7 @@ public boolean matchHeader(String headerName) { */ protected static class CompositeHeaderMatcher implements HeaderMatcher { - private static final Log LOGGER = LogFactory.getLog(HeaderMatcher.class); + private static final Log LOGGER = LogFactory.getLog(CompositeHeaderMatcher.class); private final Collection matchers; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/router/AbstractMappingMessageRouter.java b/spring-integration-core/src/main/java/org/springframework/integration/router/AbstractMappingMessageRouter.java index f28fb331f16..69c031b42d3 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/router/AbstractMappingMessageRouter.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/router/AbstractMappingMessageRouter.java @@ -264,10 +264,15 @@ protected void onInit() { @Override protected Collection determineTargetChannels(Message message) { - Collection channels = new ArrayList<>(); - Collection channelKeys = getChannelKeys(message); - addToCollection(channels, channelKeys, message); - return channels; + Collection<@Nullable Object> channelKeys = getChannelKeys(message); + if (channelKeys != null) { + Collection channels = new ArrayList<>(channelKeys.size()); + addToCollection(channels, channelKeys, message); + return channels; + } + else { + return Collections.emptyList(); + } } /** @@ -277,7 +282,7 @@ protected Collection determineTargetChannels(Message message) * @param message The message. * @return The channel keys. */ - protected abstract @Nullable List getChannelKeys(Message message); + protected abstract @Nullable List<@Nullable Object> getChannelKeys(Message message); /** * Convenience method allowing conversion of a list @@ -362,10 +367,7 @@ private void addChannel(Collection channels, Message message, } } - private void addToCollection(Collection channels, @Nullable Collection channelKeys, Message message) { - if (channelKeys == null) { - return; - } + private void addToCollection(Collection channels, Collection channelKeys, Message message) { for (Object channelKey : channelKeys) { if (channelKey != null) { addChannelKeyToCollection(channels, message, channelKey); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/router/AbstractMessageProcessingRouter.java b/spring-integration-core/src/main/java/org/springframework/integration/router/AbstractMessageProcessingRouter.java index 525980e563a..ab1319271bf 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/router/AbstractMessageProcessingRouter.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/router/AbstractMessageProcessingRouter.java @@ -19,6 +19,8 @@ import java.util.Collections; import java.util.List; +import org.jspecify.annotations.Nullable; + import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.context.Lifecycle; import org.springframework.core.convert.ConversionService; @@ -80,7 +82,7 @@ public boolean isRunning() { } @Override - protected List getChannelKeys(Message message) { + protected List<@Nullable Object> getChannelKeys(Message message) { Object result = this.messageProcessor.processMessage(message); return Collections.singletonList(result); } diff --git a/spring-integration-core/src/main/java/org/springframework/integration/router/ErrorMessageExceptionTypeRouter.java b/spring-integration-core/src/main/java/org/springframework/integration/router/ErrorMessageExceptionTypeRouter.java index df95a8e3544..a537f120f83 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/router/ErrorMessageExceptionTypeRouter.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/router/ErrorMessageExceptionTypeRouter.java @@ -23,6 +23,8 @@ import java.util.Properties; import java.util.Set; +import org.jspecify.annotations.Nullable; + import org.springframework.jmx.export.annotation.ManagedAttribute; import org.springframework.jmx.export.annotation.ManagedOperation; import org.springframework.messaging.Message; @@ -112,11 +114,10 @@ protected void onInit() { } @Override - protected List getChannelKeys(Message message) { + protected List<@Nullable Object> getChannelKeys(Message message) { String mostSpecificCause = null; Object payload = message.getPayload(); - if (payload instanceof Throwable) { - Throwable cause = (Throwable) payload; + if (payload instanceof Throwable cause) { while (cause != null) { for (Map.Entry> entry : this.classNameMappings.entrySet()) { String channelKey = entry.getKey(); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/router/HeaderValueRouter.java b/spring-integration-core/src/main/java/org/springframework/integration/router/HeaderValueRouter.java index 140939c672a..de20fc910ac 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/router/HeaderValueRouter.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/router/HeaderValueRouter.java @@ -19,6 +19,8 @@ import java.util.Collections; import java.util.List; +import org.jspecify.annotations.Nullable; + import org.springframework.messaging.Message; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -45,7 +47,7 @@ public HeaderValueRouter(String headerName) { } @Override - protected List getChannelKeys(Message message) { + protected List<@Nullable Object> getChannelKeys(Message message) { Object value = message.getHeaders().get(this.headerName); if (value instanceof String && ((String) value).indexOf(',') != -1) { value = StringUtils.tokenizeToStringArray((String) value, ","); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/router/PayloadTypeRouter.java b/spring-integration-core/src/main/java/org/springframework/integration/router/PayloadTypeRouter.java index 7cd7a347c18..437deb0da9a 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/router/PayloadTypeRouter.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/router/PayloadTypeRouter.java @@ -42,14 +42,14 @@ public class PayloadTypeRouter extends AbstractMappingMessageRouter { /** * Selects the most appropriate channel name matching channel identifiers which are the * fully qualified class names encountered while traversing the payload type hierarchy. - * To resolve ties and conflicts (e.g., Serializable and String) it will match: + * To resolve ties and conflicts (e.g., Serializable and String), it will match: * 1. Type name to channel identifier else... * 2. Name of the subclass of the type to channel identifier else... * 3. Name of the Interface of the type to channel identifier while also - * preferring direct interface over indirect subclass + * preferring direct interface to indirect subclass */ @Override - protected @Nullable List getChannelKeys(Message message) { + protected @Nullable List<@Nullable Object> getChannelKeys(Message message) { if (CollectionUtils.isEmpty(getChannelMappings())) { return null; } @@ -59,7 +59,7 @@ public class PayloadTypeRouter extends AbstractMappingMessageRouter { type = type.getComponentType(); } String closestMatch = findClosestMatch(type, isArray); - return (closestMatch != null) ? Collections.singletonList(closestMatch) : null; + return (closestMatch != null) ? Collections.<@Nullable Object>singletonList(closestMatch) : null; } private @Nullable String findClosestMatch(Class type, boolean isArray) { // NOSONAR diff --git a/spring-integration-core/src/main/java/org/springframework/integration/router/RecipientListRouter.java b/spring-integration-core/src/main/java/org/springframework/integration/router/RecipientListRouter.java index cd730312e9e..44f9240c250 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/router/RecipientListRouter.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/router/RecipientListRouter.java @@ -257,7 +257,7 @@ public IntegrationPatternType getIntegrationPatternType() { @Override protected Collection determineTargetChannels(Message message) { - List result = new ArrayList<>(); + List result = new ArrayList<>(this.recipients.size()); for (Recipient recipient : this.recipients) { if (recipient.accept(message)) { result.add(recipient.getChannel()); @@ -276,7 +276,8 @@ public static class Recipient { private final @Nullable MessageSelector selector; - private @Nullable MessageChannel channel; + @SuppressWarnings("NullAway.Init") + private MessageChannel channel; private @Nullable String channelName; @@ -308,7 +309,6 @@ public void setChannelResolver(DestinationResolver channelResolv return this.selector; } - @Nullable public MessageChannel getChannel() { if (this.channel == null) { String channelNameForInitialization = this.channelName; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/selector/PayloadTypeSelector.java b/spring-integration-core/src/main/java/org/springframework/integration/selector/PayloadTypeSelector.java index 9ca52ef8e0a..58ead58a904 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/selector/PayloadTypeSelector.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/selector/PayloadTypeSelector.java @@ -16,7 +16,7 @@ package org.springframework.integration.selector; -import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import org.springframework.integration.core.MessageSelector; @@ -29,10 +29,11 @@ * of the selector's accepted types. * * @author Mark Fisher + * @author Artem Bilan */ public class PayloadTypeSelector implements MessageSelector { - private final List> acceptedTypes = new ArrayList>(); + private final List> acceptedTypes; /** * Create a selector for the provided types. At least one is required. @@ -41,9 +42,7 @@ public class PayloadTypeSelector implements MessageSelector { */ public PayloadTypeSelector(Class... types) { Assert.notEmpty(types, "at least one type is required"); - for (Class type : types) { - this.acceptedTypes.add(type); - } + this.acceptedTypes = Arrays.asList(types); } @Override diff --git a/spring-integration-core/src/main/java/org/springframework/integration/store/AbstractKeyValueMessageStore.java b/spring-integration-core/src/main/java/org/springframework/integration/store/AbstractKeyValueMessageStore.java index f6c8092b8a0..9dc048c13f0 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/store/AbstractKeyValueMessageStore.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/store/AbstractKeyValueMessageStore.java @@ -243,7 +243,7 @@ protected void doRemoveMessagesFromGroup(Object groupId, Collection> Assert.isInstanceOf(MessageGroupMetadata.class, mgm); MessageGroupMetadata messageGroupMetadata = (MessageGroupMetadata) mgm; - List ids = new ArrayList<>(); + List ids = new ArrayList<>(messages.size()); for (Message messageToRemove : messages) { UUID id = messageToRemove.getHeaders().getId(); Assert.state(id != null, () -> "Message 'id' must not be null: " + messageToRemove); @@ -252,7 +252,7 @@ protected void doRemoveMessagesFromGroup(Object groupId, Collection> messageGroupMetadata.removeAll(ids); - List messageIds = new ArrayList<>(); + List messageIds = new ArrayList<>(ids.size()); for (UUID id : ids) { messageIds.add(this.messagePrefix + groupId + '_' + id); } @@ -391,14 +391,15 @@ private Message getMessageFromGroup(UUID messageId, Object groupId) { @Override public Collection> getMessagesForGroup(Object groupId) { MessageGroupMetadata groupMetadata = getGroupMetadata(groupId); - ArrayList> messages = new ArrayList<>(); if (groupMetadata != null) { + ArrayList> messages = new ArrayList<>(groupMetadata.size()); Iterator messageIds = groupMetadata.messageIdIterator(); while (messageIds.hasNext()) { messages.add(getMessageFromGroup(messageIds.next(), groupId)); } + return messages; } - return messages; + return Collections.emptyList(); } @Override diff --git a/spring-integration-core/src/main/java/org/springframework/integration/store/MessageGroupQueue.java b/spring-integration-core/src/main/java/org/springframework/integration/store/MessageGroupQueue.java index 0edbed997f6..424612a0eeb 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/store/MessageGroupQueue.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/store/MessageGroupQueue.java @@ -229,7 +229,7 @@ public int drainTo(Collection> c) { @Override public int drainTo(Collection> collection, int maxElements) { int originalSize = collection.size(); - ArrayList> list = new ArrayList<>(); + ArrayList> list = new ArrayList<>(maxElements); final Lock lock = this.storeLock; try { lock.lockInterruptibly(); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/support/AbstractIntegrationMessageBuilder.java b/spring-integration-core/src/main/java/org/springframework/integration/support/AbstractIntegrationMessageBuilder.java index faf4164ea29..a353b810c19 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/support/AbstractIntegrationMessageBuilder.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/support/AbstractIntegrationMessageBuilder.java @@ -70,7 +70,7 @@ public AbstractIntegrationMessageBuilder pushSequenceDetails(Object correlati List> incomingSequenceDetails = getSequenceDetails(); if (incomingCorrelationId != null) { if (incomingSequenceDetails == null) { - incomingSequenceDetails = new ArrayList<>(); + incomingSequenceDetails = new ArrayList<>(1); } else { incomingSequenceDetails = new ArrayList<>(incomingSequenceDetails); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/support/MutableMessageBuilder.java b/spring-integration-core/src/main/java/org/springframework/integration/support/MutableMessageBuilder.java index 69c3afb76fe..1f7cfba76f6 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/support/MutableMessageBuilder.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/support/MutableMessageBuilder.java @@ -82,7 +82,7 @@ public Map getHeaders() { @SuppressWarnings("unchecked") @Override - public @Nullable V getHeader(String key, Class type) { + public @Nullable V getHeader(String key, Class type) { Object value = this.headers.get(key); if (value == null) { return null; @@ -179,12 +179,10 @@ public AbstractIntegrationMessageBuilder removeHeaders(String... headerPatter } private List getMatchingHeaderNames(String pattern, Map headers) { - List matchingHeaderNames = new ArrayList<>(); - if (headers != null) { - for (Map.Entry header : headers.entrySet()) { - if (PatternMatchUtils.simpleMatch(pattern, header.getKey())) { - matchingHeaderNames.add(header.getKey()); - } + List matchingHeaderNames = new ArrayList<>(headers.size()); + for (Map.Entry header : headers.entrySet()) { + if (PatternMatchUtils.simpleMatch(pattern, header.getKey())) { + matchingHeaderNames.add(header.getKey()); } } return matchingHeaderNames; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/util/AcceptOnceCollectionFilter.java b/spring-integration-core/src/main/java/org/springframework/integration/util/AcceptOnceCollectionFilter.java index a541f3a4b55..ad0be0b61c3 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/util/AcceptOnceCollectionFilter.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/util/AcceptOnceCollectionFilter.java @@ -43,7 +43,7 @@ public class AcceptOnceCollectionFilter implements CollectionFilter { public Collection filter(Collection unfilteredElements) { this.lock.lock(); try { - List filteredElements = new ArrayList<>(); + List filteredElements = new ArrayList<>(unfilteredElements.size()); for (T element : unfilteredElements) { if (!this.lastSeenElements.contains(element)) { filteredElements.add(element); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/util/AnnotatedMethodFilter.java b/spring-integration-core/src/main/java/org/springframework/integration/util/AnnotatedMethodFilter.java index d5ce0e068bf..399d1f34281 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/util/AnnotatedMethodFilter.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/util/AnnotatedMethodFilter.java @@ -56,8 +56,8 @@ public AnnotatedMethodFilter(@Nullable Class annotationTyp } public List filter(List methods) { - List annotatedCandidates = new ArrayList<>(); - List fallbackCandidates = new ArrayList<>(); + List annotatedCandidates = new ArrayList<>(methods.size()); + List fallbackCandidates = new ArrayList<>(methods.size()); for (Method method : methods) { if (method.isBridge()) { continue; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/util/UniqueMethodFilter.java b/spring-integration-core/src/main/java/org/springframework/integration/util/UniqueMethodFilter.java index 3ee7c81997e..eade4191379 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/util/UniqueMethodFilter.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/util/UniqueMethodFilter.java @@ -27,14 +27,16 @@ * @author Oleg Zhurakousky * @author Artem Bilan * @author Ngoc Nhan + * * @since 2.0 */ public class UniqueMethodFilter implements MethodFilter { - private final List uniqueMethods = new ArrayList<>(); + private final List uniqueMethods; public UniqueMethodFilter(Class targetClass) { Method[] allMethods = ReflectionUtils.getAllDeclaredMethods(targetClass); + this.uniqueMethods = new ArrayList<>(allMethods.length); for (Method method : allMethods) { this.uniqueMethods.add(org.springframework.util.ClassUtils.getMostSpecificMethod(method, targetClass)); } diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/config/FileListFilterFactoryBean.java b/spring-integration-file/src/main/java/org/springframework/integration/file/config/FileListFilterFactoryBean.java index a897bb63c24..238a2f042ba 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/config/FileListFilterFactoryBean.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/config/FileListFilterFactoryBean.java @@ -130,9 +130,9 @@ public boolean isSingleton() { private FileListFilter initializeFileListFilter() { validate(); - final List> filtersNeeded = new ArrayList<>(); + final List> filtersNeeded = new ArrayList<>(3); - if (!Boolean.FALSE.equals(this.ignoreHidden)) { + if (this.ignoreHidden) { filtersNeeded.add(new IgnoreHiddenFileListFilter()); } diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AbstractFileListFilter.java b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AbstractFileListFilter.java index 382ce0cc11b..120123ee23e 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AbstractFileListFilter.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AbstractFileListFilter.java @@ -17,6 +17,7 @@ package org.springframework.integration.file.filters; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import org.jspecify.annotations.Nullable; @@ -38,15 +39,16 @@ public abstract class AbstractFileListFilter implements FileListFilter { @Override public final List filterFiles(F @Nullable [] files) { - List accepted = new ArrayList<>(); if (files != null) { + List accepted = new ArrayList<>(files.length); for (F file : files) { - if (this.accept(file)) { + if (accept(file)) { accepted.add(file); } } + return accepted; } - return accepted; + return Collections.emptyList(); } @Override diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AbstractLastModifiedFileListFilter.java b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AbstractLastModifiedFileListFilter.java index 52eb265e5a2..28ee0cb4dce 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AbstractLastModifiedFileListFilter.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AbstractLastModifiedFileListFilter.java @@ -19,6 +19,7 @@ import java.time.Duration; import java.time.Instant; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.function.Consumer; @@ -83,8 +84,8 @@ public void addDiscardCallback(Consumer discardCallback) { @Override public List filterFiles(F @Nullable [] files) { - List list = new ArrayList<>(); if (files != null) { + List list = new ArrayList<>(files.length); Instant now = Instant.now(); for (F file : files) { if (fileIsAged(file, now)) { @@ -94,9 +95,10 @@ else if (this.discardCallback != null) { this.discardCallback.accept(file); } } + return list; } - return list; + return Collections.emptyList(); } @Override diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AbstractMarkerFilePresentFileListFilter.java b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AbstractMarkerFilePresentFileListFilter.java index fbe15b8fbe2..03f2bbf2f18 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AbstractMarkerFilePresentFileListFilter.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AbstractMarkerFilePresentFileListFilter.java @@ -126,7 +126,7 @@ public List filterFiles(F @Nullable [] files) { final Set candidates = Arrays.stream(files) .map(this::getFilename) .collect(Collectors.toSet()); - List results = new ArrayList<>(); + List results = new ArrayList<>(files.length); for (F file : files) { boolean anyMatch = this.filtersAndFunctions.entrySet().stream().anyMatch(entry -> { F[] fileToCheck = (F[]) Array.newInstance(file.getClass(), 1); diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AbstractRecentFileListFilter.java b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AbstractRecentFileListFilter.java index 3ac61b6e745..2eab297bba2 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AbstractRecentFileListFilter.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/filters/AbstractRecentFileListFilter.java @@ -19,6 +19,7 @@ import java.time.Duration; import java.time.Instant; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import org.jspecify.annotations.Nullable; @@ -41,7 +42,7 @@ public abstract class AbstractRecentFileListFilter implements FileListFilter< private final Duration age; /** - * Construct an instance with default age as 1 day. + * Construct an instance with the default age as 1 day. */ public AbstractRecentFileListFilter() { this(Duration.ofDays(1)); @@ -58,17 +59,18 @@ public boolean supportsSingleFileFiltering() { @Override public List filterFiles(F @Nullable [] files) { - List list = new ArrayList<>(); if (files != null) { + List list = new ArrayList<>(files.length); Instant now = Instant.now(); for (F file : files) { if (!fileIsAged(file, now)) { list.add(file); } } + return list; } - return list; + return Collections.emptyList(); } @Override diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/remote/AbstractRemoteFileStreamingMessageSource.java b/spring-integration-file/src/main/java/org/springframework/integration/file/remote/AbstractRemoteFileStreamingMessageSource.java index 89f143de22f..cf6f89ed1d2 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/remote/AbstractRemoteFileStreamingMessageSource.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/remote/AbstractRemoteFileStreamingMessageSource.java @@ -265,7 +265,7 @@ private Object remoteFileToMessage(AbstractFileInfo file) { catch (RuntimeException ex) { if (this.strictOrder) { // If we could not fetch the file content, then it is fatal. - // Clear local queue to be refreshed on the next 'receive()' call. + // Clear the local queue to be refreshed on the next 'receive()' call. List> filesToReset = new ArrayList<>(); filesToReset.add(file); this.toBeReceived.drainTo(filesToReset); diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/remote/aop/StandardRotationPolicy.java b/spring-integration-file/src/main/java/org/springframework/integration/file/remote/aop/StandardRotationPolicy.java index 557280fbd18..917f06c4164 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/remote/aop/StandardRotationPolicy.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/remote/aop/StandardRotationPolicy.java @@ -54,7 +54,7 @@ public class StandardRotationPolicy implements RotationPolicy { private final DelegatingSessionFactory factory; - private final List keyDirectories = new ArrayList<>(); + private final List keyDirectories; private final boolean fair; @@ -69,10 +69,9 @@ public StandardRotationPolicy(DelegatingSessionFactory factory, List(keyDirectories); this.fair = fair; this.iterator = this.keyDirectories.iterator(); } diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/remote/gateway/AbstractRemoteFileOutboundGateway.java b/spring-integration-file/src/main/java/org/springframework/integration/file/remote/gateway/AbstractRemoteFileOutboundGateway.java index b178e2fff40..f67f72ba07b 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/remote/gateway/AbstractRemoteFileOutboundGateway.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/remote/gateway/AbstractRemoteFileOutboundGateway.java @@ -967,7 +967,7 @@ protected List mPut(Message message, Session session, File localDi private List putLocalDirectory(Message requestMessage, File file, @Nullable String subDirectory) { List filteredFiles = filterMputFiles(file.listFiles()); - List replies = new ArrayList<>(); + List replies = new ArrayList<>(filteredFiles.size()); try { for (File filteredFile : filteredFiles) { if (!filteredFile.isDirectory()) { @@ -1027,7 +1027,7 @@ protected List ls(Message message, Session session, @Nullable String di purgeDots(lsFiles); } if (this.options.contains(Option.NAME_ONLY)) { - List results = new ArrayList<>(); + List results = new ArrayList<>(lsFiles.size()); for (F file : lsFiles) { results.add(getFilename(file)); } @@ -1051,7 +1051,6 @@ protected List ls(Message message, Session session, @Nullable String di private List listFilesInRemoteDir(Session session, @Nullable String directory, String subDirectory) throws IOException { - List lsFiles = new ArrayList<>(); String remoteDirectory = buildRemotePath(directory, subDirectory); F[] list = session.list(remoteDirectory); @@ -1063,11 +1062,13 @@ private List listFilesInRemoteDir(Session session, @Nullable String direct files = Arrays.asList(list); } if (!ObjectUtils.isEmpty(files)) { + List lsFiles = new ArrayList<>(files.size()); for (F file : files) { processFile(session, directory, subDirectory, lsFiles, this.options.contains(Option.RECURSIVE), file); } + return lsFiles; } - return lsFiles; + return Collections.emptyList(); } private String buildRemotePath(@Nullable String parent, String child) { @@ -1269,10 +1270,10 @@ protected List mGet(Message message, Session session, String remoteD private List mGetWithoutRecursion(Message message, Session session, String remoteDirectory, String remoteFilename) throws IOException { - List files = new ArrayList<>(); String remotePath = buildRemotePath(remoteDirectory, remoteFilename); List> remoteFiles = lsRemoteFilesForMget(message, session, remoteDirectory, remoteFilename, remotePath); + List files = new ArrayList<>(remoteFiles.size()); try { for (AbstractFileInfo lsEntry : remoteFiles) { if (lsEntry.isDirectory()) { @@ -1313,9 +1314,9 @@ else if (ex instanceof IOException ioException) { private List mGetWithRecursion(Message message, Session session, String remoteDirectory, String remoteFilename) throws IOException { - List files = new ArrayList<>(); List> fileNames = lsRemoteFilesForMget(message, session, remoteDirectory, remoteFilename, remoteDirectory); + List files = new ArrayList<>(fileNames.size()); try { for (AbstractFileInfo lsEntry : fileNames) { File file = getRemoteFileForMget(message, session, remoteDirectory, lsEntry); diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/remote/synchronizer/AbstractInboundFileSynchronizer.java b/spring-integration-file/src/main/java/org/springframework/integration/file/remote/synchronizer/AbstractInboundFileSynchronizer.java index cc735416571..5202fcddafe 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/remote/synchronizer/AbstractInboundFileSynchronizer.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/remote/synchronizer/AbstractInboundFileSynchronizer.java @@ -25,6 +25,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.LinkedHashMap; @@ -399,7 +400,7 @@ private Integer transferFilesFromRemoteToLocal(@Nullable String remoteDirectory, List sliceToTransfer = remoteFiles; List remoteFilesToCache = null; if (!CollectionUtils.isEmpty(remoteFiles) && maxFetchSize > 0) { - remoteFilesToCache = remoteFiles; + remoteFilesToCache = new ArrayList<>(remoteFiles); sliceToTransfer = remoteFiles.stream().limit(maxFetchSize).toList(); remoteFilesToCache.removeAll(sliceToTransfer); } @@ -477,8 +478,7 @@ private List listAndFilterFiles(@Nullable String remoteDirectory, Session } } else { - filteredFiles = new ArrayList<>(); - Collections.addAll(filteredFiles, files); + filteredFiles = Arrays.asList(files); } return filteredFiles; diff --git a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/inbound/FtpStreamingMessageSource.java b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/inbound/FtpStreamingMessageSource.java index 0baf70e804b..6196c7610e3 100644 --- a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/inbound/FtpStreamingMessageSource.java +++ b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/inbound/FtpStreamingMessageSource.java @@ -70,7 +70,7 @@ public String getComponentType() { @Override protected List> asFileInfoList(Collection files) { - List> canonicalFiles = new ArrayList<>(); + List> canonicalFiles = new ArrayList<>(files.size()); for (FTPFile file : files) { canonicalFiles.add(new FtpFileInfo(file)); } diff --git a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/outbound/FtpOutboundGateway.java b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/outbound/FtpOutboundGateway.java index fc13c275c47..cb1360bf10a 100644 --- a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/outbound/FtpOutboundGateway.java +++ b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/outbound/FtpOutboundGateway.java @@ -187,7 +187,7 @@ protected long getModified(FTPFile file) { @Override protected List> asFileInfoList(Collection files) { - List> canonicalFiles = new ArrayList<>(); + List> canonicalFiles = new ArrayList<>(files.size()); for (FTPFile file : files) { canonicalFiles.add(new FtpFileInfo(file)); } diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/inbound/HttpRequestHandlingEndpointSupport.java b/spring-integration-http/src/main/java/org/springframework/integration/http/inbound/HttpRequestHandlingEndpointSupport.java index f8a438c649a..11b85a5e8ef 100644 --- a/spring-integration-http/src/main/java/org/springframework/integration/http/inbound/HttpRequestHandlingEndpointSupport.java +++ b/spring-integration-http/src/main/java/org/springframework/integration/http/inbound/HttpRequestHandlingEndpointSupport.java @@ -113,9 +113,9 @@ */ public abstract class HttpRequestHandlingEndpointSupport extends BaseHttpInboundEndpoint { - private final List> defaultMessageConverters = new ArrayList<>(); + private final List> defaultMessageConverters = new ArrayList<>(10); - private List> messageConverters = new ArrayList<>(); + private List> messageConverters = new ArrayList<>(10); private boolean convertersMerged; @@ -136,7 +136,7 @@ public HttpRequestHandlingEndpointSupport() { } /** - * Construct a gateway. If 'expectReply' is true it will wait for the + * Construct a gateway. If 'expectReply' is {@code true} it will wait for the * {@link #setReplyTimeout(long) replyTimeout} for a reply; if the timeout is exceeded * a '500 Internal Server Error' status code is returned. This can be modified using * the {@link #setStatusCodeExpression statusCodeExpression}. diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/support/DefaultHttpHeaderMapper.java b/spring-integration-http/src/main/java/org/springframework/integration/http/support/DefaultHttpHeaderMapper.java index 9dbdbd4ab81..59d7483fc52 100644 --- a/spring-integration-http/src/main/java/org/springframework/integration/http/support/DefaultHttpHeaderMapper.java +++ b/spring-integration-http/src/main/java/org/springframework/integration/http/support/DefaultHttpHeaderMapper.java @@ -450,7 +450,7 @@ else if (value instanceof Iterable) { private void setAccept(HttpHeaders target, Object value) { Collection valuesToAccept = valueToCollection(value); if (!CollectionUtils.isEmpty(valuesToAccept)) { - List acceptableMediaTypes = new ArrayList<>(); + List acceptableMediaTypes = new ArrayList<>(valuesToAccept.size()); for (Object type : valuesToAccept) { if (type instanceof MimeType) { acceptableMediaTypes.add(MediaType.asMediaType((MimeType) type)); @@ -472,7 +472,7 @@ else if (type instanceof String) { private void setAcceptCharset(HttpHeaders target, Object value) { Collection valuesToConvert = valueToCollection(value); if (!CollectionUtils.isEmpty(valuesToConvert)) { - List acceptableCharsets = new ArrayList<>(); + List acceptableCharsets = new ArrayList<>(valuesToConvert.size()); for (Object charset : valuesToConvert) { if (charset instanceof Charset) { acceptableCharsets.add((Charset) charset); @@ -665,11 +665,11 @@ else if (value instanceof String) { private void setIfNoneMatch(HttpHeaders target, Object value) { Collection valuesToAccept = valueToCollection(value); - List ifNoneMatchList = new ArrayList<>(); + List ifNoneMatchList = new ArrayList<>(valuesToAccept.size()); for (Object match : valuesToAccept) { - if (match instanceof String) { - ifNoneMatchList.add((String) match); + if (match instanceof String stringValue) { + ifNoneMatchList.add(stringValue); } else { throwIllegalArgumentForUnexpectedValue( diff --git a/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/config/IntegrationMBeanExportConfiguration.java b/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/config/IntegrationMBeanExportConfiguration.java index e9cdc3351af..0958a95c9c1 100644 --- a/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/config/IntegrationMBeanExportConfiguration.java +++ b/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/config/IntegrationMBeanExportConfiguration.java @@ -143,8 +143,8 @@ private void setupServer(IntegrationMBeanExporter exporter) { } private void setupComponentNamePatterns(IntegrationMBeanExporter exporter) { - List patterns = new ArrayList<>(); String[] managedComponents = this.attributes.getStringArray("managedComponents"); + List patterns = new ArrayList<>(managedComponents.length); for (String managedComponent : managedComponents) { String pattern = this.environment.resolvePlaceholders(managedComponent); patterns.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(pattern))); diff --git a/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/inbound/DefaultMBeanObjectConverter.java b/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/inbound/DefaultMBeanObjectConverter.java index b985eb50476..6aa35fceb98 100644 --- a/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/inbound/DefaultMBeanObjectConverter.java +++ b/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/inbound/DefaultMBeanObjectConverter.java @@ -132,8 +132,8 @@ else if (input != null && input.getClass().isArray()) { private @Nullable Object convertFromArray(Object input) { if (CompositeData.class.isAssignableFrom(input.getClass().getComponentType())) { - List<@Nullable Object> converted = new ArrayList<>(); int length = Array.getLength(input); + List<@Nullable Object> converted = new ArrayList<>(length); for (int i = 0; i < length; i++) { Object value = checkAndConvert(Array.get(input, i)); converted.add(value); diff --git a/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/inbound/NotificationListeningMessageProducer.java b/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/inbound/NotificationListeningMessageProducer.java index 3991a942c9e..c593a5585e4 100644 --- a/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/inbound/NotificationListeningMessageProducer.java +++ b/spring-integration-jmx/src/main/java/org/springframework/integration/jmx/inbound/NotificationListeningMessageProducer.java @@ -202,7 +202,7 @@ protected void doStop() { * @return the collection of {@link ObjectName} ofr provided {@link #mBeanObjectNames}. */ protected Collection retrieveMBeanNames() { - List objectNames = new ArrayList<>(); + List objectNames = new ArrayList<>(this.mBeanObjectNames.length); for (ObjectName pattern : this.mBeanObjectNames) { Set mBeanInfos; try { diff --git a/spring-integration-jpa/src/main/java/org/springframework/integration/jpa/support/parametersource/BeanPropertyParameterSource.java b/spring-integration-jpa/src/main/java/org/springframework/integration/jpa/support/parametersource/BeanPropertyParameterSource.java index 7e46b21fff2..201fe6e5f53 100644 --- a/spring-integration-jpa/src/main/java/org/springframework/integration/jpa/support/parametersource/BeanPropertyParameterSource.java +++ b/spring-integration-jpa/src/main/java/org/springframework/integration/jpa/support/parametersource/BeanPropertyParameterSource.java @@ -73,8 +73,8 @@ public boolean hasValue(String paramName) { */ public String[] getReadablePropertyNames() { if (this.propertyNames == null) { - final List names = new ArrayList<>(); PropertyDescriptor[] props = this.beanWrapper.getPropertyDescriptors(); + final List names = new ArrayList<>(props.length); for (PropertyDescriptor pd : props) { if (this.beanWrapper.isReadableProperty(pd.getName())) { names.add(pd.getName()); diff --git a/spring-integration-kafka/src/main/java/org/springframework/integration/kafka/inbound/KafkaMessageSource.java b/spring-integration-kafka/src/main/java/org/springframework/integration/kafka/inbound/KafkaMessageSource.java index 8b29c8fa609..1a11cb67878 100644 --- a/spring-integration-kafka/src/main/java/org/springframework/integration/kafka/inbound/KafkaMessageSource.java +++ b/spring-integration-kafka/src/main/java/org/springframework/integration/kafka/inbound/KafkaMessageSource.java @@ -897,7 +897,7 @@ private void commitIfPossible(ConsumerRecord record) { // NOSONAR synchronized (candidates) { if (candidates.iterator().next().equals(this.ackInfo)) { // see if there are any pending acks for higher offsets - List> toCommit = new ArrayList<>(); + List> toCommit = new ArrayList<>(candidates.size()); for (KafkaAckInfo info : candidates) { if (!this.ackInfo.equals(info)) { if (info.isAckDeferred()) { diff --git a/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/AbstractConfigurableMongoDbMessageStore.java b/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/AbstractConfigurableMongoDbMessageStore.java index 37c22eabf16..313cd00971e 100644 --- a/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/AbstractConfigurableMongoDbMessageStore.java +++ b/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/AbstractConfigurableMongoDbMessageStore.java @@ -16,7 +16,6 @@ package org.springframework.integration.mongodb.store; -import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; @@ -152,9 +151,7 @@ public void afterPropertiesSet() { this.mappingMongoConverter = new MappingMongoConverter(new DefaultDbRefResolver(this.mongoDbFactory), new MongoMappingContext()); this.mappingMongoConverter.setApplicationContext(this.applicationContext); - List customConverters = new ArrayList<>(); - customConverters.add(new MessageToBinaryConverter()); - customConverters.add(new BinaryToMessageConverter()); + List customConverters = List.of(new MessageToBinaryConverter(), new BinaryToMessageConverter()); this.mappingMongoConverter.setCustomConversions(new MongoCustomConversions(customConverters)); this.mappingMongoConverter.afterPropertiesSet(); } diff --git a/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/ConfigurableMongoDbMessageStore.java b/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/ConfigurableMongoDbMessageStore.java index e20a61acc52..4032ae5a96e 100644 --- a/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/ConfigurableMongoDbMessageStore.java +++ b/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/ConfigurableMongoDbMessageStore.java @@ -178,7 +178,7 @@ protected void doAddMessagesToGroup(Object groupId, Message... messages) { @Override protected void doRemoveMessagesFromGroup(Object groupId, Collection> messages) { - Collection ids = new ArrayList<>(); + Collection ids = new ArrayList<>(messages.size()); for (Message messageToRemove : messages) { ids.add(Objects.requireNonNull(messageToRemove.getHeaders().getId())); if (ids.size() >= getRemoveBatchSize()) { diff --git a/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/MongoDbMessageStore.java b/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/MongoDbMessageStore.java index 1b28fd972f5..9cd02641af1 100644 --- a/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/MongoDbMessageStore.java +++ b/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/MongoDbMessageStore.java @@ -322,7 +322,7 @@ protected void doAddMessagesToGroup(Object groupId, Message... messages) { @Override protected void doRemoveMessagesFromGroup(Object groupId, Collection> messages) { - Collection ids = new ArrayList<>(); + Collection ids = new ArrayList<>(messages.size()); for (Message messageToRemove : messages) { UUID id = messageToRemove.getHeaders().getId(); Assert.state(id != null, () -> "The message 'id' must notbe null:" + messageToRemove); @@ -552,7 +552,8 @@ void setCustomConverters(Object @Nullable ... customConverters) { @Override public void afterPropertiesSet() { - List converters = new ArrayList<>(); + List converters = + new ArrayList<>(7 + (this.customConverters != null ? this.customConverters.length : 0)); converters.add(new MessageHistoryToDocumentConverter()); converters.add(new DocumentToMessageHistoryConverter()); converters.add(new DocumentToGenericMessageConverter()); diff --git a/spring-integration-mqtt/src/main/java/org/springframework/integration/mqtt/inbound/Mqttv5PahoMessageDrivenChannelAdapter.java b/spring-integration-mqtt/src/main/java/org/springframework/integration/mqtt/inbound/Mqttv5PahoMessageDrivenChannelAdapter.java index adc30b489e4..4512396e9ce 100644 --- a/spring-integration-mqtt/src/main/java/org/springframework/integration/mqtt/inbound/Mqttv5PahoMessageDrivenChannelAdapter.java +++ b/spring-integration-mqtt/src/main/java/org/springframework/integration/mqtt/inbound/Mqttv5PahoMessageDrivenChannelAdapter.java @@ -121,7 +121,7 @@ public class Mqttv5PahoMessageDrivenChannelAdapter */ public Mqttv5PahoMessageDrivenChannelAdapter(String url, String clientId, MqttSubscription... mqttSubscriptions) { this(url, clientId, Arrays.stream(mqttSubscriptions).map(MqttSubscription::getTopic).toArray(String[]::new)); - this.subscriptions = new ArrayList<>(); + this.subscriptions = new ArrayList<>(mqttSubscriptions.length); Collections.addAll(this.subscriptions, mqttSubscriptions); } @@ -145,7 +145,7 @@ public Mqttv5PahoMessageDrivenChannelAdapter(MqttConnectionOptions connectionOpt this(connectionOptions, clientId, Arrays.stream(mqttSubscriptions).map(MqttSubscription::getTopic).toArray(String[]::new)); - this.subscriptions = new ArrayList<>(); + this.subscriptions = new ArrayList<>(mqttSubscriptions.length); Collections.addAll(this.subscriptions, mqttSubscriptions); } @@ -171,7 +171,7 @@ public Mqttv5PahoMessageDrivenChannelAdapter(ClientManager(); + this.subscriptions = new ArrayList<>(mqttSubscriptions.length); Collections.addAll(this.subscriptions, mqttSubscriptions); } diff --git a/spring-integration-redis/src/main/java/org/springframework/integration/redis/inbound/RedisInboundChannelAdapter.java b/spring-integration-redis/src/main/java/org/springframework/integration/redis/inbound/RedisInboundChannelAdapter.java index ae46e0a524e..1060def5f80 100644 --- a/spring-integration-redis/src/main/java/org/springframework/integration/redis/inbound/RedisInboundChannelAdapter.java +++ b/spring-integration-redis/src/main/java/org/springframework/integration/redis/inbound/RedisInboundChannelAdapter.java @@ -126,7 +126,7 @@ protected void onInit() { MessageListenerDelegate delegate = new MessageListenerDelegate(); MessageListenerAdapter adapter = new MessageListenerAdapter(delegate); adapter.setSerializer(this.serializer); - List topicList = new ArrayList<>(); + List topicList = new ArrayList<>(hasTopics ? this.topics.length : this.topicPatterns.length); if (hasTopics) { for (String topic : this.topics) { topicList.add(new ChannelTopic(topic)); diff --git a/spring-integration-redis/src/main/java/org/springframework/integration/redis/outbound/ExpressionArgumentsStrategy.java b/spring-integration-redis/src/main/java/org/springframework/integration/redis/outbound/ExpressionArgumentsStrategy.java index 4502e41691b..42d7e86e01f 100644 --- a/spring-integration-redis/src/main/java/org/springframework/integration/redis/outbound/ExpressionArgumentsStrategy.java +++ b/spring-integration-redis/src/main/java/org/springframework/integration/redis/outbound/ExpressionArgumentsStrategy.java @@ -85,7 +85,7 @@ public Object[] resolve(String command, Message message) { evaluationContextToUse = IntegrationContextUtils.getEvaluationContext(this.beanFactory); evaluationContextToUse.setVariable("cmd", command); } - List arguments = new ArrayList<>(); + List arguments = new ArrayList<>(this.argumentExpressions.length); for (Expression argumentExpression : this.argumentExpressions) { Object argument = argumentExpression.getValue(evaluationContextToUse, message); if (argument != null) { diff --git a/spring-integration-rsocket/src/main/java/org/springframework/integration/rsocket/IntegrationRSocketMessageHandler.java b/spring-integration-rsocket/src/main/java/org/springframework/integration/rsocket/IntegrationRSocketMessageHandler.java index 7d45427ca6e..582ceb06bcf 100644 --- a/spring-integration-rsocket/src/main/java/org/springframework/integration/rsocket/IntegrationRSocketMessageHandler.java +++ b/spring-integration-rsocket/src/main/java/org/springframework/integration/rsocket/IntegrationRSocketMessageHandler.java @@ -128,9 +128,10 @@ protected List initReturnValueHandler new IntegrationRSocketPayloadReturnValueHandler((List>) getEncoders(), getReactiveAdapterRegistry()); if (this.messageMappingCompatible) { - List handlers = new ArrayList<>(); + List customHandlers = getReturnValueHandlerConfigurer().getCustomHandlers(); + List handlers = new ArrayList<>(customHandlers.size() + 1); handlers.add(integrationRSocketPayloadReturnValueHandler); - handlers.addAll(getReturnValueHandlerConfigurer().getCustomHandlers()); + handlers.addAll(customHandlers); return handlers; } else { diff --git a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/inbound/SftpStreamingMessageSource.java b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/inbound/SftpStreamingMessageSource.java index 30703816b12..d5bf99b6c3b 100644 --- a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/inbound/SftpStreamingMessageSource.java +++ b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/inbound/SftpStreamingMessageSource.java @@ -72,7 +72,7 @@ public String getComponentType() { @Override protected List> asFileInfoList(Collection files) { - List> canonicalFiles = new ArrayList<>(); + List> canonicalFiles = new ArrayList<>(files.size()); for (SftpClient.DirEntry file : files) { canonicalFiles.add(new SftpFileInfo(file)); } diff --git a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/session/ResourceKnownHostsServerKeyVerifier.java b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/session/ResourceKnownHostsServerKeyVerifier.java index 7989764d138..3f402f2866f 100644 --- a/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/session/ResourceKnownHostsServerKeyVerifier.java +++ b/spring-integration-sftp/src/main/java/org/springframework/integration/sftp/session/ResourceKnownHostsServerKeyVerifier.java @@ -121,7 +121,7 @@ private static List findKnownHostEntr return Collections.emptyList(); } - List matches = new ArrayList<>(); + List matches = new ArrayList<>(knownHosts.size()); for (KnownHostsServerKeyVerifier.HostEntryPair match : knownHosts) { KnownHostEntry entry = match.getHostEntry(); for (SshdSocketAddress host : candidates) { diff --git a/spring-integration-smb/src/main/java/org/springframework/integration/smb/inbound/SmbStreamingMessageSource.java b/spring-integration-smb/src/main/java/org/springframework/integration/smb/inbound/SmbStreamingMessageSource.java index 5856eb75e8b..6dbb8c1da59 100644 --- a/spring-integration-smb/src/main/java/org/springframework/integration/smb/inbound/SmbStreamingMessageSource.java +++ b/spring-integration-smb/src/main/java/org/springframework/integration/smb/inbound/SmbStreamingMessageSource.java @@ -72,7 +72,7 @@ public String getComponentType() { @Override protected List> asFileInfoList(Collection files) { - List> canonicalFiles = new ArrayList<>(); + List> canonicalFiles = new ArrayList<>(files.size()); for (SmbFile file : files) { canonicalFiles.add(new SmbFileInfo(file)); } diff --git a/spring-integration-smb/src/main/java/org/springframework/integration/smb/outbound/SmbOutboundGateway.java b/spring-integration-smb/src/main/java/org/springframework/integration/smb/outbound/SmbOutboundGateway.java index 643cd1d83c5..18c773888ec 100644 --- a/spring-integration-smb/src/main/java/org/springframework/integration/smb/outbound/SmbOutboundGateway.java +++ b/spring-integration-smb/src/main/java/org/springframework/integration/smb/outbound/SmbOutboundGateway.java @@ -163,7 +163,7 @@ protected long getModified(SmbFile file) { @Override protected List> asFileInfoList(Collection files) { - List> canonicalFiles = new ArrayList<>(); + List> canonicalFiles = new ArrayList<>(files.size()); for (SmbFile file : files) { canonicalFiles.add(new SmbFileInfo(file)); } diff --git a/spring-integration-websocket/src/main/java/org/springframework/integration/websocket/support/PassThruSubProtocolHandler.java b/spring-integration-websocket/src/main/java/org/springframework/integration/websocket/support/PassThruSubProtocolHandler.java index cb9de5a1a74..321d09c1af6 100644 --- a/spring-integration-websocket/src/main/java/org/springframework/integration/websocket/support/PassThruSubProtocolHandler.java +++ b/spring-integration-websocket/src/main/java/org/springframework/integration/websocket/support/PassThruSubProtocolHandler.java @@ -19,6 +19,7 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import org.jspecify.annotations.Nullable; @@ -52,7 +53,7 @@ public class PassThruSubProtocolHandler implements SubProtocolHandler { public void setSupportedProtocols(String... supportedProtocols) { Assert.noNullElements(supportedProtocols, "'supportedProtocols' must not be empty"); - this.supportedProtocols.addAll(Arrays.asList(supportedProtocols)); + Collections.addAll(this.supportedProtocols, supportedProtocols); } @Override diff --git a/spring-integration-ws/src/main/java/org/springframework/integration/ws/DefaultSoapHeaderMapper.java b/spring-integration-ws/src/main/java/org/springframework/integration/ws/DefaultSoapHeaderMapper.java index d36e6b1b373..271a6756564 100644 --- a/spring-integration-ws/src/main/java/org/springframework/integration/ws/DefaultSoapHeaderMapper.java +++ b/spring-integration-ws/src/main/java/org/springframework/integration/ws/DefaultSoapHeaderMapper.java @@ -16,7 +16,6 @@ package org.springframework.integration.ws; -import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; @@ -62,13 +61,9 @@ */ public class DefaultSoapHeaderMapper extends AbstractHeaderMapper implements SoapHeaderMapper { - protected static final List STANDARD_HEADER_NAMES = new ArrayList<>(); + protected static final List STANDARD_HEADER_NAMES = List.of(WebServiceHeaders.SOAP_ACTION); - static { - STANDARD_HEADER_NAMES.add(WebServiceHeaders.SOAP_ACTION); - } - - protected final TransformerHelper transformerHelper = new TransformerHelper(); // NOSONAR final + protected final TransformerHelper transformerHelper = new TransformerHelper(); public DefaultSoapHeaderMapper() { super(WebServiceHeaders.PREFIX, STANDARD_HEADER_NAMES, Collections.emptyList()); diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/router/XPathRouter.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/router/XPathRouter.java index 9e3112a7b62..063fbca6133 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/router/XPathRouter.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/router/XPathRouter.java @@ -20,7 +20,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Objects; import org.jspecify.annotations.Nullable; import org.w3c.dom.DOMException; @@ -114,13 +113,13 @@ public String getComponentType() { } @Override - protected List getChannelKeys(Message message) { + protected List<@Nullable Object> getChannelKeys(Message message) { Node node = this.converter.convertToNode(message.getPayload()); if (this.evaluateAsString) { - return Collections.singletonList(Objects.requireNonNull(this.xPathExpression.evaluateAsString(node))); + return Collections.<@Nullable Object>singletonList(this.xPathExpression.evaluateAsString(node)); } else { - return this.xPathExpression.evaluate(node, this.nodeMapper); + return (List<@Nullable Object>) this.xPathExpression.evaluate(node, this.nodeMapper); } } diff --git a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/support/DefaultXmppHeaderMapper.java b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/support/DefaultXmppHeaderMapper.java index 2a877407166..40b552261c2 100644 --- a/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/support/DefaultXmppHeaderMapper.java +++ b/spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/support/DefaultXmppHeaderMapper.java @@ -16,7 +16,6 @@ package org.springframework.integration.xmpp.support; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -47,15 +46,12 @@ */ public class DefaultXmppHeaderMapper extends AbstractHeaderMapper implements XmppHeaderMapper { - private static final List STANDARD_HEADER_NAMES = new ArrayList<>(); - - static { - STANDARD_HEADER_NAMES.add(XmppHeaders.FROM); - STANDARD_HEADER_NAMES.add(XmppHeaders.SUBJECT); - STANDARD_HEADER_NAMES.add(XmppHeaders.THREAD); - STANDARD_HEADER_NAMES.add(XmppHeaders.TO); - STANDARD_HEADER_NAMES.add(XmppHeaders.TYPE); - } + private static final List STANDARD_HEADER_NAMES = + List.of(XmppHeaders.FROM, + XmppHeaders.SUBJECT, + XmppHeaders.THREAD, + XmppHeaders.TO, + XmppHeaders.TYPE); public DefaultXmppHeaderMapper() { super(XmppHeaders.PREFIX, STANDARD_HEADER_NAMES, STANDARD_HEADER_NAMES);