diff --git a/spring-integration-core/src/main/java/org/springframework/integration/dispatcher/OrderedAwareCopyOnWriteArraySet.java b/spring-integration-core/src/main/java/org/springframework/integration/dispatcher/OrderedAwareCopyOnWriteArraySet.java index 9e46fff2e8..286305ea74 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/dispatcher/OrderedAwareCopyOnWriteArraySet.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/dispatcher/OrderedAwareCopyOnWriteArraySet.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -51,9 +51,11 @@ import org.springframework.util.StringUtils; * @author Mark Fisher * @author Diego Belfer * @author Gary Russell + * @author Artem Bilan + * * @since 1.0.3 */ -@SuppressWarnings({"unchecked"}) +@SuppressWarnings({ "unchecked" }) class OrderedAwareCopyOnWriteArraySet implements Set { private final OrderComparator comparator = new OrderComparator(); @@ -69,7 +71,7 @@ class OrderedAwareCopyOnWriteArraySet implements Set { private final Set unmodifiableElements; OrderedAwareCopyOnWriteArraySet() { - this.elements = new CopyOnWriteArraySet(); + this.elements = new CopyOnWriteArraySet<>(); this.unmodifiableElements = Collections.unmodifiableSet(this.elements); } @@ -87,14 +89,12 @@ class OrderedAwareCopyOnWriteArraySet implements Set { Assert.notNull(o, "Can not add NULL object"); this.writeLock.lock(); try { - boolean present = false; if (o instanceof Ordered) { - present = this.addOrderedElement((Ordered) o); + return addOrderedElement((Ordered) o); } else { - present = this.elements.add(o); + return this.elements.add(o); } - return present; } finally { this.writeLock.unlock(); @@ -110,7 +110,7 @@ class OrderedAwareCopyOnWriteArraySet implements Set { this.writeLock.lock(); try { for (E object : c) { - this.add(object); + add(object); } return true; } @@ -119,25 +119,17 @@ class OrderedAwareCopyOnWriteArraySet implements Set { } } - /** - * {@inheritDoc} - */ @Override public boolean remove(Object o) { this.writeLock.lock(); try { - boolean removed = this.elements.remove(o); - //unmodifiableElements = Collections.unmodifiableSet(this); - return removed; + return this.elements.remove(o); } finally { this.writeLock.unlock(); } } - /** - * {@inheritDoc} - */ @Override public boolean removeAll(Collection c) { if (CollectionUtils.isEmpty(c)) { diff --git a/spring-integration-core/src/main/java/org/springframework/integration/handler/DelayHandler.java b/spring-integration-core/src/main/java/org/springframework/integration/handler/DelayHandler.java index 75b4ba4910..90b44a8b11 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/handler/DelayHandler.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/handler/DelayHandler.java @@ -347,48 +347,54 @@ public class DelayHandler extends AbstractReplyProducingMessageHandler implement } private long determineDelayForMessage(Message message) { + if (this.delayExpression != null) { + return determineDelayFromExpression(message); + } + else { + return defaultDelay; + } + } + + private long determineDelayFromExpression(Message message) { + long delay = this.defaultDelay; DelayedMessageWrapper delayedMessageWrapper = null; if (message.getPayload() instanceof DelayedMessageWrapper) { delayedMessageWrapper = (DelayedMessageWrapper) message.getPayload(); } - - long delay = this.defaultDelay; - if (this.delayExpression != null) { - Exception delayValueException = null; - Object delayValue = null; + Exception delayValueException = null; + Object delayValue = null; + try { + delayValue = this.delayExpression.getValue(this.evaluationContext, + delayedMessageWrapper != null ? delayedMessageWrapper.getOriginal() : message); + } + catch (EvaluationException e) { + delayValueException = e; + } + if (delayValue instanceof Date) { + long current = delayedMessageWrapper != null + ? delayedMessageWrapper.getRequestDate() + : System.currentTimeMillis(); + delay = ((Date) delayValue).getTime() - current; + } + else if (delayValue != null) { try { - delayValue = this.delayExpression.getValue(this.evaluationContext, - delayedMessageWrapper != null ? delayedMessageWrapper.getOriginal() : message); + delay = Long.parseLong(delayValue.toString()); } - catch (EvaluationException e) { + catch (NumberFormatException e) { delayValueException = e; } - if (delayValue instanceof Date) { - long current = delayedMessageWrapper != null - ? delayedMessageWrapper.getRequestDate() - : System.currentTimeMillis(); - delay = ((Date) delayValue).getTime() - current; - } - else if (delayValue != null) { - try { - delay = Long.valueOf(delayValue.toString()); - } - catch (NumberFormatException e) { - delayValueException = e; + } + if (delayValueException != null) { + if (this.ignoreExpressionFailures) { + if (logger.isDebugEnabled()) { + logger.debug("Failed to get delay value from 'delayExpression': " + + delayValueException.getMessage() + + ". Will fall back to default delay: " + this.defaultDelay); } } - if (delayValueException != null) { - if (this.ignoreExpressionFailures) { - if (logger.isDebugEnabled()) { - logger.debug("Failed to get delay value from 'delayExpression': " + - delayValueException.getMessage() + - ". Will fall back to default delay: " + this.defaultDelay); - } - } - else { - throw new IllegalStateException("Error occurred during 'delay' value determination", - delayValueException); - } + else { + throw new IllegalStateException("Error occurred during 'delay' value determination", + delayValueException); } } return delay; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/handler/LoggingHandler.java b/spring-integration-core/src/main/java/org/springframework/integration/handler/LoggingHandler.java index 3f05c94b92..cc5ace0c71 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/handler/LoggingHandler.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/handler/LoggingHandler.java @@ -174,7 +174,7 @@ public class LoggingHandler extends AbstractMessageHandler { this.evaluationContext = ExpressionUtils.createStandardEvaluationContext(getBeanFactory()); } - @Override + @Override // NOSONAR protected void handleMessageInternal(Message message) { switch (this.level) { case FATAL: diff --git a/spring-integration-core/src/main/java/org/springframework/integration/message/AdviceMessage.java b/spring-integration-core/src/main/java/org/springframework/integration/message/AdviceMessage.java index 16c6fb7dd7..1489c4e603 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/message/AdviceMessage.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/message/AdviceMessage.java @@ -17,6 +17,7 @@ package org.springframework.integration.message; import java.util.Map; +import java.util.Objects; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; @@ -52,7 +53,7 @@ public class AdviceMessage extends GenericMessage { /** * A constructor with the {@link MessageHeaders} instance to use. - *

Note: the given {@code MessageHeaders} instance is used + *

Note: the given {@link MessageHeaders} instance is used * directly in the new message, i.e. it is not copied. * @param payload the message payload (never {@code null}) * @param headers message headers @@ -76,4 +77,24 @@ public class AdviceMessage extends GenericMessage { return builder.toString(); } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof AdviceMessage)) { + return false; + } + if (!super.equals(o)) { + return false; + } + AdviceMessage that = (AdviceMessage) o; + return Objects.equals(this.inputMessage, that.inputMessage); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), this.inputMessage); + } + } 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 53b120ab7a..9042e91b7a 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 @@ -63,7 +63,7 @@ public abstract class AbstractMappingMessageRouter extends AbstractMessageRouter @Override protected boolean removeEldestEntry(Entry eldest) { - return this.size() > AbstractMappingMessageRouter.this.dynamicChannelLimit; + return size() > AbstractMappingMessageRouter.this.dynamicChannelLimit; } }); @@ -288,14 +288,8 @@ public abstract class AbstractMappingMessageRouter extends AbstractMessageRouter } private void addToCollection(Collection channels, Collection channelKeys, Message message) { - if (channelKeys == null) { - return; - } for (Object channelKey : channelKeys) { - if (channelKey == null) { - continue; - } - else if (channelKey instanceof MessageChannel) { + if (channelKey instanceof MessageChannel) { channels.add((MessageChannel) channelKey); } else if (channelKey instanceof MessageChannel[]) { 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 1d3224d4b5..841f167e1b 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 @@ -59,7 +59,7 @@ public class PayloadTypeRouter extends AbstractMappingMessageRouter { return (closestMatch != null) ? Collections.singletonList(closestMatch) : null; } - private String findClosestMatch(Class type, boolean isArray) { + private String findClosestMatch(Class type, boolean isArray) { // NOSONAR int minTypeDiffWeight = Integer.MAX_VALUE; List matches = new LinkedList<>(); for (String candidate : getChannelMappings().keySet()) {