diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/dispatcher/AggregateMessageDeliveryException.java b/org.springframework.integration/src/main/java/org/springframework/integration/dispatcher/AggregateMessageDeliveryException.java index 72348acaa4..e98dead3a5 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/dispatcher/AggregateMessageDeliveryException.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/dispatcher/AggregateMessageDeliveryException.java @@ -16,35 +16,53 @@ package org.springframework.integration.dispatcher; -import java.util.Collections; -import java.util.List; - import org.springframework.integration.core.Message; import org.springframework.integration.message.MessageDeliveryException; +import java.util.Collections; +import java.util.List; + /** - * An Exception that encapsulates an aggregated group of Exceptions for use by - * dispatchers that may try multiple handler invocations within a single dispatch - * operation. - * + * An Exception that encapsulates an aggregated group of Exceptions for use by dispatchers that may try multiple handler + * invocations within a single dispatch operation. + * * @author Mark Fisher * @since 1.0.3 */ @SuppressWarnings("serial") public class AggregateMessageDeliveryException extends MessageDeliveryException { - private final List aggregatedExceptions; + private final List aggregatedExceptions; - public AggregateMessageDeliveryException(Message undeliveredMessage, - String description, List aggregatedExceptions) { - super(undeliveredMessage, description); - this.aggregatedExceptions = aggregatedExceptions; - } + public AggregateMessageDeliveryException(Message undeliveredMessage, + String description, List aggregatedExceptions) { + super(undeliveredMessage, description); + this.initCause(aggregatedExceptions.get(0)); + this.aggregatedExceptions = aggregatedExceptions; + } - public List getAggregatedExceptions() { - return Collections.unmodifiableList(this.aggregatedExceptions); - } + public List getAggregatedExceptions() { + return Collections.unmodifiableList(this.aggregatedExceptions); + } + @Override + public String getMessage() { + String baseMessage = super.getMessage(); + StringBuilder message = new StringBuilder(endingWithPeriod(baseMessage) + " Multiple causes are:\n"); + for (Exception exception : aggregatedExceptions) { + message.append(" " + exception.getMessage() + "\n"); + } + message.append("See below for the stacktrace of the first cause."); + return message.toString(); + } + + private String endingWithPeriod(String baseMessage) { + if (baseMessage.endsWith(".")) { + return baseMessage; + } else { + return baseMessage + "."; + } + } } diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/dispatcher/AggregateMessageDeliveryExceptionTest.java b/org.springframework.integration/src/test/java/org/springframework/integration/dispatcher/AggregateMessageDeliveryExceptionTest.java new file mode 100644 index 0000000000..e49744fe63 --- /dev/null +++ b/org.springframework.integration/src/test/java/org/springframework/integration/dispatcher/AggregateMessageDeliveryExceptionTest.java @@ -0,0 +1,69 @@ +/* + * Copyright 2002-2010 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.integration.dispatcher; + +import org.junit.Ignore; +import org.junit.Test; +import org.junit.matchers.JUnitMatchers; +import org.springframework.integration.core.Message; +import org.springframework.integration.message.MessageDeliveryException; +import org.springframework.integration.message.StringMessage; + +import java.util.Arrays; +import java.util.List; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +/** + * + * @author Iwein Fuld + */ +public class AggregateMessageDeliveryExceptionTest { + + private Message message = new StringMessage("foo"); + private AggregateMessageDeliveryException exception = new AggregateMessageDeliveryException(message, "something went wrong", exceptionsList()); + private MessageDeliveryException firstProblem; + + private List exceptionsList() { + firstProblem = new MessageDeliveryException(message, "first problem"); + return Arrays.asList( + firstProblem, + new MessageDeliveryException(message,"second problem"), + new MessageDeliveryException(message, "third problem") + ); + + } + + @Test + @Ignore //turn this on if you want to read the message and stacktrace in the console + public void shouldThrow(){ + throw exception; + } + + @Test + public void shouldShowOriginalExceptionsInMessage() { + assertThat(exception.getMessage(), JUnitMatchers.containsString("first problem")); + assertThat(exception.getMessage(), JUnitMatchers.containsString("second problem")); + assertThat(exception.getMessage(), JUnitMatchers.containsString("third problem")); + } + + @Test + public void shouldShowFirstOriginalExceptionInCause() { + assertThat((MessageDeliveryException) exception.getCause(), is(firstProblem)); + } +}