From 42e681f62333fdbdbe8827c8728a4fe14d00be39 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Wed, 8 Apr 2026 19:19:33 +0200 Subject: [PATCH 1/3] CAMEL-22549: Replace deprecated getOut/hasOut/setOut with ExchangeHelper methods in core modules Add ExchangeHelper.createResponse() and createResponseFromInput() as idempotent helpers for creating response messages. Migrate all core modules from deprecated Exchange.getOut()/hasOut()/setOut() to the new ExchangeHelper-based API. Co-Authored-By: Claude Opus 4.6 --- .../cxf/transport/CamelDestination.java | 10 +- .../camel/converter/CamelConverter.java | 10 +- .../org/apache/camel/processor/Enricher.java | 2 +- .../processor/OnCompletionProcessor.java | 6 +- .../apache/camel/processor/PollEnricher.java | 4 +- .../camel/processor/TransformProcessor.java | 4 +- .../camel/processor/WireTapProcessor.java | 7 +- .../errorhandler/RedeliveryErrorHandler.java | 10 +- .../camel/support/DefaultExchangeHolder.java | 15 ++- .../apache/camel/support/ExchangeHelper.java | 114 ++++++++++++++---- .../support/processor/MarshalProcessor.java | 6 +- .../support/processor/UnmarshalProcessor.java | 13 +- 12 files changed, 131 insertions(+), 70 deletions(-) diff --git a/components/camel-cxf/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/transport/CamelDestination.java b/components/camel-cxf/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/transport/CamelDestination.java index e3418ec1fb9d2..7cc97419533bc 100644 --- a/components/camel-cxf/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/transport/CamelDestination.java +++ b/components/camel-cxf/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/transport/CamelDestination.java @@ -29,6 +29,7 @@ import org.apache.camel.component.cxf.common.header.CxfHeaderHelper; import org.apache.camel.component.cxf.transport.message.DefaultCxfMessageMapper; import org.apache.camel.spi.HeaderFilterStrategy; +import org.apache.camel.support.ExchangeHelper; import org.apache.camel.support.service.ServiceHelper; import org.apache.camel.util.ObjectHelper; import org.apache.cxf.Bus; @@ -260,10 +261,11 @@ protected ConduitInitiator getConduitInitiator() { } protected void propagateResponseHeadersToCamel(Message outMessage, Exchange camelExchange) { + ExchangeHelper.createResponse(camelExchange); // copy the camel in message header to the out message - camelExchange.getOut().getHeaders().putAll(camelExchange.getIn().getHeaders()); + camelExchange.getMessage().getHeaders().putAll(camelExchange.getIn().getHeaders()); CxfHeaderHelper.propagateCxfToCamel(headerFilterStrategy, outMessage, - camelExchange.getOut(), camelExchange); + camelExchange.getMessage(), camelExchange); } /** @@ -289,9 +291,9 @@ private void commitOutputMessage() throws IOException { } OutputStream outputStream = outMessage.getContent(OutputStream.class); if (outputStream instanceof CachedOutputStream cachedOutputStream) { - camelExchange.getOut().setBody(cachedOutputStream.getInputStream()); + camelExchange.getMessage().setBody(cachedOutputStream.getInputStream()); } else { - camelExchange.getOut().setBody(outputStream); + camelExchange.getMessage().setBody(outputStream); } LOG.debug("send the response message: {}", outputStream); } diff --git a/core/camel-base/src/main/java/org/apache/camel/converter/CamelConverter.java b/core/camel-base/src/main/java/org/apache/camel/converter/CamelConverter.java index 043aa83398c43..b7e4485be02f4 100644 --- a/core/camel-base/src/main/java/org/apache/camel/converter/CamelConverter.java +++ b/core/camel-base/src/main/java/org/apache/camel/converter/CamelConverter.java @@ -18,9 +18,9 @@ import org.apache.camel.Converter; import org.apache.camel.Expression; -import org.apache.camel.Message; import org.apache.camel.Predicate; import org.apache.camel.Processor; +import org.apache.camel.support.ExchangeHelper; /** * Some useful converters for Camel APIs such as to convert a {@link Predicate} or {@link Expression} to a @@ -40,9 +40,7 @@ public static Processor toProcessor(final Expression expression) { return exchange -> { // the response from a expression should be set on OUT Object answer = expression.evaluate(exchange, Object.class); - Message out = exchange.getOut(); - out.copyFrom(exchange.getIn()); - out.setBody(answer); + ExchangeHelper.createResponseFromInput(exchange).setBody(answer); }; } @@ -51,9 +49,7 @@ public static Processor toProcessor(final Predicate predicate) { return exchange -> { // the response from a predicate should be set on OUT boolean answer = predicate.matches(exchange); - Message out = exchange.getOut(); - out.copyFrom(exchange.getIn()); - out.setBody(answer); + ExchangeHelper.createResponseFromInput(exchange).setBody(answer); }; } diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/Enricher.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/Enricher.java index 0d69a6095b2ed..c481606a4a25b 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/Enricher.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/Enricher.java @@ -272,7 +272,7 @@ protected Exchange createResourceExchange(Exchange source, ExchangePattern patte private static void prepareResult(Exchange exchange) { if (exchange.getPattern().isOutCapable()) { - exchange.getOut().copyFrom(exchange.getIn()); + ExchangeHelper.createResponseFromInput(exchange); } } diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/OnCompletionProcessor.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/OnCompletionProcessor.java index 38faece9f1df0..7f89ee5602ca9 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/OnCompletionProcessor.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/OnCompletionProcessor.java @@ -224,11 +224,7 @@ protected Exchange prepareExchange(Exchange exchange) { // to cause side effects of the original exchange // (the original thread will run in parallel) answer = ExchangeHelper.createCorrelatedCopy(exchange, false); - if (answer.hasOut()) { - // move OUT to IN (pipes and filters) - answer.setIn(answer.getOut()); - answer.setOut(null); - } + ExchangeHelper.prepareOutToIn(answer); // set MEP to InOnly as this onCompletion is a fire and forget answer.setPattern(ExchangePattern.InOnly); } else { diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/PollEnricher.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/PollEnricher.java index ecddf04a03d21..f3db59a04bbfd 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/PollEnricher.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/PollEnricher.java @@ -490,7 +490,7 @@ protected void preCheckPoll(Exchange exchange) throws Exception { private static void prepareResult(Exchange exchange) { if (exchange.getPattern().isOutCapable()) { - exchange.getOut().copyFrom(exchange.getIn()); + ExchangeHelper.createResponseFromInput(exchange); } } @@ -638,7 +638,7 @@ public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { // and therefore we should set an empty body to indicate this fact // but keep headers/attachments as we want to propagate those oldExchange.getIn().setBody(null); - oldExchange.setOut(null); + ExchangeHelper.setResponse(oldExchange, null); } return oldExchange; } diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/TransformProcessor.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/TransformProcessor.java index 5f834310e7ca4..4755b2bbbce08 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/TransformProcessor.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/TransformProcessor.java @@ -69,8 +69,8 @@ public boolean process(Exchange exchange, AsyncCallback callback) { old.setBody(newBody); // but the message must be on OUT - if (!exchange.hasOut()) { - exchange.setOut(exchange.getIn()); + if (!ExchangeHelper.hasResponse(exchange)) { + ExchangeHelper.setResponse(exchange, exchange.getIn()); } } diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/WireTapProcessor.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/WireTapProcessor.java index 34cc7b9156780..a8953d041d4f0 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/WireTapProcessor.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/WireTapProcessor.java @@ -39,6 +39,7 @@ import org.apache.camel.spi.RouteIdAware; import org.apache.camel.spi.ShutdownAware; import org.apache.camel.support.AsyncProcessorConverterHelper; +import org.apache.camel.support.ExchangeHelper; import org.apache.camel.support.service.ServiceHelper; import org.apache.camel.util.ObjectHelper; import org.slf4j.Logger; @@ -253,11 +254,7 @@ private Exchange configureCopyExchange(Exchange exchange) throws IOException { target.removeProperty(ExchangePropertyKey.CORRELATION_ID); // set MEP to InOnly as this wire tap is a fire and forget target.setPattern(ExchangePattern.InOnly); - // move OUT to IN if needed - if (target.hasOut()) { - target.setIn(target.getOut()); - target.setOut(null); - } + ExchangeHelper.prepareOutToIn(target); // remove STREAM_CACHE_UNIT_OF_WORK property because this wire tap will // close its own created stream cache(s) target.removeProperty(ExchangePropertyKey.STREAM_CACHE_UNIT_OF_WORK); diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/errorhandler/RedeliveryErrorHandler.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/errorhandler/RedeliveryErrorHandler.java index 63693b60dd375..9204ffc9d23b4 100644 --- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/errorhandler/RedeliveryErrorHandler.java +++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/errorhandler/RedeliveryErrorHandler.java @@ -567,9 +567,9 @@ private void deliverToFailureProcessor( LOG.trace("Using the original IN message body instead of current"); exchange.getIn().setBody(original.getBody()); } - if (exchange.hasOut()) { + if (ExchangeHelper.hasResponse(exchange)) { LOG.trace("Removing the out message to avoid some uncertain behavior"); - exchange.setOut(null); + ExchangeHelper.setResponse(exchange, null); } } @@ -1285,7 +1285,7 @@ protected void prepareExchangeForRedelivery() { // we are redelivering so copy from original back to exchange exchange.getIn().copyFrom(this.original.getIn()); - exchange.setOut(null); + ExchangeHelper.setResponse(exchange, null); // reset cached streams so they can be read again MessageHelper.resetStreamCache(exchange.getIn()); @@ -1490,9 +1490,9 @@ protected void deliverToFailureProcessor( LOG.trace("Using the original IN message body instead of current"); exchange.getIn().setBody(original.getBody()); } - if (exchange.hasOut()) { + if (ExchangeHelper.hasResponse(exchange)) { LOG.trace("Removing the out message to avoid some uncertain behavior"); - exchange.setOut(null); + ExchangeHelper.setResponse(exchange, null); } } diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java b/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java index 768c09c18b435..04d84fcfc3bec 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/DefaultExchangeHolder.java @@ -26,6 +26,7 @@ import java.util.Map; import org.apache.camel.Exchange; +import org.apache.camel.Message; import org.apache.camel.RuntimeExchangeException; import org.apache.camel.WrappedFile; import org.apache.camel.util.ObjectHelper; @@ -137,8 +138,8 @@ public static DefaultExchangeHolder marshal( } payload.inBody = checkSerializableBody("in body", exchange, exchange.getIn().getBody()); payload.safeSetInHeaders(exchange, allowSerializedValues); - if (exchange.hasOut()) { - payload.outBody = checkSerializableBody("out body", exchange, exchange.getOut().getBody()); + if (ExchangeHelper.hasResponse(exchange)) { + payload.outBody = checkSerializableBody("out body", exchange, exchange.getMessage().getBody()); payload.safeSetOutHeaders(exchange, allowSerializedValues); } if (includeProperties) { @@ -168,9 +169,10 @@ public static void unmarshal(Exchange exchange, DefaultExchangeHolder payload) { exchange.getIn().setHeaders(payload.inHeaders); } if (payload.outBody != null) { - exchange.getOut().setBody(payload.outBody); + // reuse existing response message to preserve its type (e.g. JmsMessage) + ExchangeHelper.createResponse(exchange).setBody(payload.outBody); if (payload.outHeaders != null) { - exchange.getOut().setHeaders(payload.outHeaders); + exchange.getMessage().setHeaders(payload.outHeaders); } } if (payload.properties != null) { @@ -249,9 +251,10 @@ private Map safeSetInHeaders(Exchange exchange, boolean allowSer @Deprecated(since = "3.0.0") private Map safeSetOutHeaders(Exchange exchange, boolean allowSerializedValues) { - if (exchange.hasOut() && exchange.getOut().hasHeaders()) { + if (ExchangeHelper.hasResponse(exchange) && exchange.getMessage().hasHeaders()) { Map map - = checkValidHeaderObjects("out headers", exchange, exchange.getOut().getHeaders(), allowSerializedValues); + = checkValidHeaderObjects("out headers", exchange, exchange.getMessage().getHeaders(), + allowSerializedValues); if (map != null && !map.isEmpty()) { outHeaders = new LinkedHashMap<>(map); } diff --git a/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java index 0fe62aac33590..3dae7434d610e 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java @@ -304,8 +304,8 @@ public static Exchange createCorrelatedCopy(Exchange exchange, boolean handover, Exchange copy = exchange.copy(); // do not reuse message id on copy if (!useSameMessageId) { - if (copy.hasOut()) { - copy.getOut().setMessageId(null); + if (hasResponse(copy)) { + copy.getMessage().setMessageId(null); } copy.getIn().setMessageId(null); } @@ -366,7 +366,7 @@ private static void doCopyResults(Exchange result, Exchange source, boolean pres return; } - if (source.hasOut()) { + if (hasResponse(source)) { copyFromOutMessage(result, source, preserverPattern); } else { copyFromInMessage(result, source, preserverPattern); @@ -400,9 +400,9 @@ private static void doCopyResults(Exchange result, Exchange source, boolean pres private static void copyFromOutMessageConditionally(Exchange result, Exchange source) { // we just need to ensure MEP is as expected (eg copy result to OUT if out capable) // and the result is not failed - if (result.getPattern().isOutCapable() && !result.hasOut() && !result.isFailed()) { + if (result.getPattern().isOutCapable() && !hasResponse(result) && !result.isFailed()) { // copy IN to OUT as we expect a OUT response - result.getOut().copyFrom(source.getIn()); + setResponse(result, source.getIn().copy()); } } @@ -413,13 +413,13 @@ private static void copyFromInMessage(Exchange result, Exchange source, boolean // so lets assume the last IN is the OUT if (!preserverPattern && result.getPattern().isOutCapable()) { // only set OUT if its OUT capable - result.getOut().copyFrom(source.getIn()); + setResponse(result, source.getIn().copy()); } else { // if not replace IN instead to keep the MEP result.getIn().copyFrom(source.getIn()); // clear any existing OUT as the result is on the IN - if (result.hasOut()) { - result.setOut(null); + if (hasResponse(result)) { + setResponse(result, null); } } } @@ -428,9 +428,9 @@ private static void copyFromOutMessage(Exchange result, Exchange source, boolean if (preserverPattern) { // exchange pattern sensitive Message resultMessage = getResultMessage(result); - resultMessage.copyFrom(source.getOut()); + resultMessage.copyFrom(source.getMessage()); } else { - result.getOut().copyFrom(source.getOut()); + setResponse(result, source.getMessage().copy()); } } @@ -442,7 +442,7 @@ private static void copyFromOutMessage(Exchange result, Exchange source, boolean */ public static Message getResultMessage(Exchange exchange) { if (exchange.getPattern().isOutCapable()) { - return exchange.getOut(); + return createResponse(exchange); } else { return exchange.getIn(); } @@ -704,10 +704,10 @@ public static Object extractResultBody(Exchange exchange, ExchangePattern patter // okay no fault then return the response according to the pattern // try to honor pattern if provided boolean notOut = pattern != null && !pattern.isOutCapable(); - boolean hasOut = exchange.hasOut(); + boolean hasOut = hasResponse(exchange); if (hasOut && !notOut) { // we have a response in out and the pattern is out capable - answer = exchange.getOut().getBody(); + answer = exchange.getMessage().getBody(); } else { // use IN as the response answer = exchange.getIn().getBody(); @@ -810,9 +810,9 @@ private static T doExtractFutureBody(CamelContext context, Object result, Cl */ public static void prepareOutToIn(Exchange exchange) { // we are routing using pipes and filters so we need to manually copy OUT to IN - if (exchange.hasOut()) { - exchange.setIn(exchange.getOut()); - exchange.setOut(null); + if (hasResponse(exchange)) { + exchange.setIn(exchange.getMessage()); + setResponse(exchange, null); } } @@ -853,8 +853,8 @@ public static Exchange copyExchangeWithProperties(Exchange exchange, CamelContex setMessageHistory(answer, exchange); answer.setIn(exchange.getIn().copy()); - if (exchange.hasOut()) { - answer.setOut(exchange.getOut().copy()); + if (hasResponse(exchange)) { + setResponse(answer, exchange.getMessage().copy()); } answer.setException(exchange.getException()); return answer; @@ -869,8 +869,8 @@ public static Exchange copyExchangeWithProperties(Exchange exchange, CamelContex */ public static void replaceMessage(Exchange exchange, Message newMessage, boolean outOnly) { Message old = exchange.getMessage(); - if (outOnly || exchange.hasOut()) { - exchange.setOut(newMessage); + if (outOnly || hasResponse(exchange)) { + setResponse(exchange, newMessage); } else { exchange.setIn(newMessage); } @@ -1095,8 +1095,7 @@ public static Route getRoute(Exchange exchange) { */ public static void setInOutBodyPatternAware(Exchange exchange, Object body) { if (exchange.getPattern().isOutCapable()) { - exchange.getOut().copyFrom(exchange.getIn()); - exchange.getOut().setBody(body); + createResponseFromInput(exchange).setBody(body); } else { exchange.getIn().setBody(body); } @@ -1111,8 +1110,7 @@ public static void setInOutBodyPatternAware(Exchange exchange, Object body) { */ public static void setOutBodyPatternAware(Exchange exchange, Object body) { if (exchange.getPattern().isOutCapable()) { - exchange.getOut().copyFrom(exchange.getIn()); - exchange.getOut().setBody(body); + createResponseFromInput(exchange).setBody(body); } } @@ -1303,4 +1301,72 @@ public static T getBodyAndResetStreamCache(Exchange exchange, Class type) return exchange.getMessage().getBody(type); } + /** + * Returns true if a response message has been explicitly set on this exchange. + *

+ * This is a non-deprecated equivalent of {@link Exchange#hasOut()}, provided as a utility until a proper + * {@code hasResponse()} method is added to the {@link Exchange} API. + */ + public static boolean hasResponse(Exchange exchange) { + return exchange.getIn() != exchange.getMessage(); + } + + /** + * Returns the response message if one has been explicitly set, null otherwise. Unlike the deprecated + * {@link Exchange#getOut()}, this does NOT lazily create an empty message. + *

+ * This is provided as a utility until a proper {@code getResponse()} method is added to the {@link Exchange} API. + */ + public static Message getResponse(Exchange exchange) { + return hasResponse(exchange) ? exchange.getMessage() : null; + } + + /** + * Sets the response message on this exchange. Unlike {@link Exchange#getOut()} which lazily creates an empty + * message on read, this makes response creation explicit. + *

+ * This is a non-deprecated equivalent of {@link Exchange#setOut(Message)}, provided as a utility until a proper + * {@code setResponse(Message)} method is added to the {@link Exchange} API. + */ + @SuppressWarnings("deprecation") + public static void setResponse(Exchange exchange, Message response) { + exchange.setOut(response); + } + + /** + * Creates a new empty response message on the exchange and returns it. If a response already exists, returns it + * as-is. This is the non-deprecated equivalent of the lazy-creation side effect of {@link Exchange#getOut()}. + *

+ * Typical usage: + * + *

+     * Message response = ExchangeHelper.createResponse(exchange);
+     * response.setBody(result);
+     * 
+ */ + public static Message createResponse(Exchange exchange) { + if (!hasResponse(exchange)) { + setResponse(exchange, new DefaultMessage(exchange.getContext())); + } + return exchange.getMessage(); + } + + /** + * Creates a response message by copying the input message (headers, body, attachments) and returns it. Use this + * when the response should inherit the input message's headers. If a response already exists, returns it as-is. + *

+ * Typical usage: + * + *

+     * Message response = ExchangeHelper.createResponseFromInput(exchange);
+     * response.setBody(result);
+     * 
+ */ + public static Message createResponseFromInput(Exchange exchange) { + if (!hasResponse(exchange)) { + setResponse(exchange, exchange.getIn().copy()); + } + return exchange.getMessage(); + } + } diff --git a/core/camel-support/src/main/java/org/apache/camel/support/processor/MarshalProcessor.java b/core/camel-support/src/main/java/org/apache/camel/support/processor/MarshalProcessor.java index f31cbf0ac1b7f..f69d0b1fb2cb6 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/processor/MarshalProcessor.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/processor/MarshalProcessor.java @@ -68,8 +68,8 @@ public boolean process(Exchange exchange, AsyncCallback callback) { // lets setup the out message before we invoke the dataFormat // so that it can mutate it if necessary - Message out = exchange.getOut(); - out.copyFrom(in); + ExchangeHelper.setResponse(exchange, in.copy()); + Message out = exchange.getMessage(); try { dataFormat.marshal(exchange, body, osb); @@ -82,7 +82,7 @@ public boolean process(Exchange exchange, AsyncCallback callback) { } } catch (Exception e) { // remove OUT message, as an exception occurred - exchange.setOut(null); + ExchangeHelper.setResponse(exchange, null); exchange.setException(e); } diff --git a/core/camel-support/src/main/java/org/apache/camel/support/processor/UnmarshalProcessor.java b/core/camel-support/src/main/java/org/apache/camel/support/processor/UnmarshalProcessor.java index 4de97930ad8bc..3634a777c32ca 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/processor/UnmarshalProcessor.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/processor/UnmarshalProcessor.java @@ -76,12 +76,13 @@ public boolean process(Exchange exchange, AsyncCallback callback) { } final Message out; if (allowNullBody && body == null) { - // The body is null, and it is an allowed value so let's skip the unmarshalling - out = exchange.getOut(); + // The body is null, and it is an allowed value so let's skip the unmarshalling; + // use empty response (not in.copy()) so the null body is preserved + out = ExchangeHelper.createResponse(exchange); } else { // lets set up the out message before we invoke the dataFormat so that it can mutate it if necessary - out = exchange.getOut(); - out.copyFrom(in); + ExchangeHelper.setResponse(exchange, in.copy()); + out = exchange.getMessage(); if (body instanceof InputStream is) { stream = is; result = dataFormat.unmarshal(exchange, stream); @@ -103,7 +104,7 @@ public boolean process(Exchange exchange, AsyncCallback callback) { ExchangeHelper.setVariable(exchange, variableReceive, value); } else { // the dataformat has probably set headers, attachments, etc. so let's use it as the outbound payload - exchange.setOut(msg); + ExchangeHelper.setResponse(exchange, msg); } } else { // result should be stored in variable instead of message body @@ -115,7 +116,7 @@ public boolean process(Exchange exchange, AsyncCallback callback) { } } catch (Exception e) { // remove OUT message, as an exception occurred - exchange.setOut(null); + ExchangeHelper.setResponse(exchange, null); exchange.setException(e); } finally { // The Iterator will close the stream itself From 3675b50b35c5ec75b4089b8324154ac516eb9968 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Wed, 8 Apr 2026 19:19:56 +0200 Subject: [PATCH 2/3] CAMEL-22549: Replace deprecated getOut/hasOut/setOut with ExchangeHelper methods in components Migrate all component modules from deprecated Exchange.getOut()/hasOut()/setOut() to ExchangeHelper.hasResponse(), getResponse(), setResponse(), createResponse(), and createResponseFromInput(). Co-Authored-By: Claude Opus 4.6 --- .../chatscript/ChatScriptProducer.java | 2 +- .../camel/component/avro/AvroListener.java | 2 +- .../camel/component/avro/AvroProducer.java | 4 +- .../dataformat/barcode/BarcodeDataFormat.java | 4 +- .../camel/component/bean/MethodInfo.java | 14 +++---- .../camel/language/bean/BeanExpression.java | 11 ++++-- .../dataformat/beanio/BeanIODataFormat.java | 2 +- .../fixed/BindyFixedLengthDataFormat.java | 4 +- .../org/apache/camel/coap/CoAPProducer.java | 6 +-- .../component/cometd/CometdConsumer.java | 3 +- .../crypto/PGPKeyAccessDataFormat.java | 4 +- .../crypto/processor/SigningProcessor.java | 4 +- .../component/cxf/jaxrs/CxfRsInvoker.java | 3 +- .../component/cxf/jaxrs/CxfRsProducer.java | 1 - .../message/DefaultCxfMessageMapper.java | 4 +- .../exec/impl/DefaultExecBinding.java | 7 +--- .../camel/component/file/GenericFile.java | 5 ++- .../camel/component/fop/FopProducer.java | 5 +-- .../github/producer/CreateIssueProducer.java | 4 +- .../producer/GetCommitFileProducer.java | 4 +- .../producer/PullRequestFilesProducer.java | 4 +- .../producer/PullRequestStateProducer.java | 4 +- .../camel/component/hl7/HL7DataFormat.java | 8 ++-- .../camel/component/http/HttpProducer.java | 3 +- .../component/influxdb/InfluxDbProducer.java | 3 -- .../influxdb2/InfluxDb2Producer.java | 2 - .../component/ironmq/IronMQProducer.java | 8 +--- .../camel/component/jcr/JcrProducer.java | 3 +- .../camel/component/jms/JmsProducer.java | 6 +-- .../jms/reply/ReplyManagerSupport.java | 4 +- .../camel/component/jooq/JooqProducer.java | 4 +- .../camel/component/mina/MinaConsumer.java | 20 +++------- .../component/mina/MinaPayloadHelper.java | 20 +++------- .../camel/component/mina/MinaProducer.java | 17 ++------ .../component/mock/MockExpressionClause.java | 14 +++---- .../camel/language/mvel/RootObject.java | 1 + .../component/mybatis/MyBatisProducer.java | 4 +- .../component/netty/NettyPayloadHelper.java | 36 ++++------------- .../camel/component/netty/NettyProducer.java | 20 +++------- .../netty/handlers/ClientChannelHandler.java | 21 +++++----- .../netty/handlers/ServerChannelHandler.java | 8 +--- .../ServerResponseFutureListener.java | 7 +--- .../camel/language/ognl/RootObject.java | 1 + .../component/olingo2/Olingo2Producer.java | 6 +-- .../component/olingo4/Olingo4Producer.java | 6 +-- .../quickfixj/QuickfixjConsumer.java | 3 +- .../streams/util/UnwrapStreamProcessor.java | 5 ++- .../rest/RestProducerBindingProcessor.java | 3 +- .../reply/RocketMQReplyManagerSupport.java | 2 +- .../processor/AnalyticsApiProcessor.java | 10 ++--- .../internal/processor/BulkApiProcessor.java | 10 ++--- .../processor/CompositeApiProcessor.java | 31 +++++++-------- .../CompositeSObjectCollectionsProcessor.java | 7 ++-- .../internal/processor/JsonRestProcessor.java | 22 +++++------ .../sap/netweaver/NetWeaverProducer.java | 2 +- .../camel/component/xquery/XQueryBuilder.java | 9 +++-- .../camel/component/sjms/SjmsProducer.java | 6 +-- .../sjms/reply/ReplyManagerSupport.java | 4 +- .../smooks/converter/SinkConverter.java | 2 +- .../soap/Soap11DataFormatAdapter.java | 2 +- .../soap/Soap12DataFormatAdapter.java | 2 +- .../camel/dataformat/soap/SoapDataFormat.java | 2 +- .../spring/batch/SpringBatchProducer.java | 3 +- .../spring/ws/SpringWebserviceProducer.java | 10 +---- .../camel/language/spel/RootObject.java | 1 + .../sql/stored/SqlStoredProducer.java | 19 ++++----- .../camel/component/ssh/SshProducer.java | 9 ++--- .../camel/component/stax/StAXProcessor.java | 8 +--- .../undertow/UndertowClientCallback.java | 4 +- .../camel/component/vertx/VertxProducer.java | 3 -- .../processor/XmlSignerProcessor.java | 39 +++++++------------ .../processor/XmlVerifierProcessor.java | 9 +---- .../xpath/MessageVariableResolver.java | 5 ++- .../camel/language/xpath/XPathBuilder.java | 34 ++++++++++++---- .../camel/component/xslt/XsltBuilder.java | 11 ++++-- 75 files changed, 231 insertions(+), 369 deletions(-) diff --git a/components/camel-ai/camel-chatscript/src/main/java/org/apache/camel/component/chatscript/ChatScriptProducer.java b/components/camel-ai/camel-chatscript/src/main/java/org/apache/camel/component/chatscript/ChatScriptProducer.java index ecc50ab65bb0e..2c8adf7290f5d 100644 --- a/components/camel-ai/camel-chatscript/src/main/java/org/apache/camel/component/chatscript/ChatScriptProducer.java +++ b/components/camel-ai/camel-chatscript/src/main/java/org/apache/camel/component/chatscript/ChatScriptProducer.java @@ -50,7 +50,7 @@ public void process(Exchange exchange) throws Exception { inputMessage.setBotName(endpoint.getBotName()); String response = this.endpoint.getBot().sendChat(inputMessage); inputMessage.setReply(response); - exchange.getOut().setBody(inputMessage); + exchange.getMessage().setBody(inputMessage); } private ChatScriptMessage buildMessage(Object body) throws Exception { diff --git a/components/camel-avro-rpc/camel-avro-rpc-component/src/main/java/org/apache/camel/component/avro/AvroListener.java b/components/camel-avro-rpc/camel-avro-rpc-component/src/main/java/org/apache/camel/component/avro/AvroListener.java index 9c15ec5076506..73de0d47dc67c 100644 --- a/components/camel-avro-rpc/camel-avro-rpc-component/src/main/java/org/apache/camel/component/avro/AvroListener.java +++ b/components/camel-avro-rpc/camel-avro-rpc-component/src/main/java/org/apache/camel/component/avro/AvroListener.java @@ -202,7 +202,7 @@ private static Object processExchange(AvroConsumer consumer, Protocol.Message me } if (ExchangeHelper.isOutCapable(exchange)) { - response = exchange.getOut().getBody(); + response = exchange.getMessage().getBody(); } else { response = null; } diff --git a/components/camel-avro-rpc/camel-avro-rpc-component/src/main/java/org/apache/camel/component/avro/AvroProducer.java b/components/camel-avro-rpc/camel-avro-rpc-component/src/main/java/org/apache/camel/component/avro/AvroProducer.java index a0142e0859950..19963b7d490be 100644 --- a/components/camel-avro-rpc/camel-avro-rpc-component/src/main/java/org/apache/camel/component/avro/AvroProducer.java +++ b/components/camel-avro-rpc/camel-avro-rpc-component/src/main/java/org/apache/camel/component/avro/AvroProducer.java @@ -58,9 +58,7 @@ public boolean process(final Exchange exchange, final AsyncCallback callback) { public void handleResult(Object result) { // got result from avro, so set it on the exchange and invoke the callback try { - // propagate headers - exchange.getOut().setHeaders(exchange.getIn().getHeaders()); - exchange.getOut().setBody(result); + exchange.getMessage().setBody(result); } finally { callback.done(false); } diff --git a/components/camel-barcode/src/main/java/org/apache/camel/dataformat/barcode/BarcodeDataFormat.java b/components/camel-barcode/src/main/java/org/apache/camel/dataformat/barcode/BarcodeDataFormat.java index 6ea130c112b4b..07d0898ccb25a 100644 --- a/components/camel-barcode/src/main/java/org/apache/camel/dataformat/barcode/BarcodeDataFormat.java +++ b/components/camel-barcode/src/main/java/org/apache/camel/dataformat/barcode/BarcodeDataFormat.java @@ -212,11 +212,11 @@ private String readImage(final Exchange exchange, final InputStream stream) thro final Result result = reader.decode(bitmap, readerHintMap); // write the found barcode format into the header - exchange.getOut().setHeader(Barcode.BARCODE_FORMAT, result.getBarcodeFormat()); + exchange.getMessage().setHeader(Barcode.BARCODE_FORMAT, result.getBarcodeFormat()); if (result.getResultMetadata() != null) { result.getResultMetadata().forEach((k, v) -> { - exchange.getOut().setHeader(k.toString(), v); + exchange.getMessage().setHeader(k.toString(), v); }); } diff --git a/components/camel-bean/src/main/java/org/apache/camel/component/bean/MethodInfo.java b/components/camel-bean/src/main/java/org/apache/camel/component/bean/MethodInfo.java index 29c7a46b8e3ee..1a7a64c22360e 100644 --- a/components/camel-bean/src/main/java/org/apache/camel/component/bean/MethodInfo.java +++ b/components/camel-bean/src/main/java/org/apache/camel/component/bean/MethodInfo.java @@ -395,16 +395,12 @@ public AccessibleObject getStaticPart() { private void fillResult(Exchange exchange, Object result) { LOG.trace("Setting bean invocation result : {}", result); - // the bean component forces OUT if the MEP is OUT capable - boolean out = exchange.hasOut() || ExchangeHelper.isOutCapable(exchange); - Message old; - if (out) { - old = exchange.getOut(); - // propagate headers - exchange.getOut().getHeaders().putAll(exchange.getIn().getHeaders()); - } else { - old = exchange.getIn(); + // the bean component forces OUT if the MEP is OUT capable; + // createResponseFromInput() both creates the OUT and propagates headers in one step + if (ExchangeHelper.isOutCapable(exchange) && !ExchangeHelper.hasResponse(exchange)) { + ExchangeHelper.createResponseFromInput(exchange); } + Message old = exchange.getMessage(); // create a new message container, so we do not drag specialized message objects along // but that is only needed if the old message is a specialized message diff --git a/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanExpression.java b/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanExpression.java index d1227c9713320..f6f99152289f4 100644 --- a/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanExpression.java +++ b/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanExpression.java @@ -25,6 +25,7 @@ import org.apache.camel.ExchangePattern; import org.apache.camel.Expression; import org.apache.camel.ExpressionIllegalSyntaxException; +import org.apache.camel.Message; import org.apache.camel.NoSuchBeanException; import org.apache.camel.Predicate; import org.apache.camel.RuntimeCamelException; @@ -368,15 +369,17 @@ private static Object invokeBean(BeanHolder beanHolder, String beanName, String // force to use InOut to retrieve the result on the OUT message resultExchange.setPattern(ExchangePattern.InOut); processor.process(resultExchange); - // the response is always stored in OUT - result = resultExchange.hasOut() ? resultExchange.getOut().getBody() : null; + // the bean component creates an OUT for non-void methods on OUT-capable exchanges, + // so getResponse() returns null for void methods (no result) and the OUT for non-void + Message response = ExchangeHelper.getResponse(resultExchange); + result = response != null ? response.getBody() : null; // propagate properties and headers from result if (resultExchange.hasProperties()) { exchange.getProperties().putAll(resultExchange.getProperties()); } - if (resultExchange.hasOut() && resultExchange.getOut().hasHeaders()) { - exchange.getIn().getHeaders().putAll(resultExchange.getOut().getHeaders()); + if (response != null && response.hasHeaders()) { + exchange.getIn().getHeaders().putAll(response.getHeaders()); } // propagate exceptions diff --git a/components/camel-beanio/src/main/java/org/apache/camel/dataformat/beanio/BeanIODataFormat.java b/components/camel-beanio/src/main/java/org/apache/camel/dataformat/beanio/BeanIODataFormat.java index abb3aed9195a9..498cf34cf0218 100644 --- a/components/camel-beanio/src/main/java/org/apache/camel/dataformat/beanio/BeanIODataFormat.java +++ b/components/camel-beanio/src/main/java/org/apache/camel/dataformat/beanio/BeanIODataFormat.java @@ -202,7 +202,7 @@ private List readModels(Exchange exchange, InputStream stream) throws Ex Object readObject; while ((readObject = in.read()) != null) { if (readObject instanceof BeanIOHeader beanioheader) { - exchange.getOut().getHeaders().putAll(beanioheader.getHeaders()); + exchange.getMessage().getHeaders().putAll(beanioheader.getHeaders()); } results.add(readObject); } diff --git a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/fixed/BindyFixedLengthDataFormat.java b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/fixed/BindyFixedLengthDataFormat.java index 51404e36edcd4..55005717d3312 100644 --- a/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/fixed/BindyFixedLengthDataFormat.java +++ b/components/camel-bindy/src/main/java/org/apache/camel/dataformat/bindy/fixed/BindyFixedLengthDataFormat.java @@ -213,7 +213,7 @@ public Object unmarshal(Exchange exchange, InputStream inputStream) throws Excep if (!factory.skipHeader()) { Map headerObjMap = createModel(headerFactory, line, count.intValue()); - exchange.getOut().setHeader(CAMEL_BINDY_FIXED_LENGTH_HEADER, headerObjMap); + exchange.getMessage().setHeader(CAMEL_BINDY_FIXED_LENGTH_HEADER, headerObjMap); } } @@ -242,7 +242,7 @@ public Object unmarshal(Exchange exchange, InputStream inputStream) throws Excep if (factory.hasFooter()) { if (!factory.skipFooter()) { Map footerObjMap = createModel(footerFactory, thisLine, count.intValue()); - exchange.getOut().setHeader(CAMEL_BINDY_FIXED_LENGTH_FOOTER, footerObjMap); + exchange.getMessage().setHeader(CAMEL_BINDY_FIXED_LENGTH_FOOTER, footerObjMap); } } else { model = createModel(factory, thisLine, count.intValue()); diff --git a/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPProducer.java b/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPProducer.java index 21cea49926a37..67fc3dc797068 100644 --- a/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPProducer.java +++ b/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPProducer.java @@ -17,7 +17,6 @@ package org.apache.camel.coap; import org.apache.camel.Exchange; -import org.apache.camel.Message; import org.apache.camel.support.DefaultProducer; import org.eclipse.californium.core.CoapClient; import org.eclipse.californium.core.CoapResponse; @@ -80,12 +79,11 @@ public void process(Exchange exchange) throws Exception { } if (response != null) { - CoAPHelper.convertCoapResponseToMessage(response, exchange.getOut()); + CoAPHelper.convertCoapResponseToMessage(response, exchange.getMessage()); } if (method.equalsIgnoreCase(CoAPConstants.METHOD_PING)) { - Message resp = exchange.getOut(); - resp.setBody(pingResponse); + exchange.getMessage().setBody(pingResponse); } } diff --git a/components/camel-cometd/src/main/java/org/apache/camel/component/cometd/CometdConsumer.java b/components/camel-cometd/src/main/java/org/apache/camel/component/cometd/CometdConsumer.java index 5f557476005a5..bf3fdcc81c731 100644 --- a/components/camel-cometd/src/main/java/org/apache/camel/component/cometd/CometdConsumer.java +++ b/components/camel-cometd/src/main/java/org/apache/camel/component/cometd/CometdConsumer.java @@ -109,7 +109,8 @@ public void push(ServerSession remote, ServerMessage cometdMessage) throws Excep ServerChannel channel = getBayeux().getChannel(channelName); ServerSession serverSession = getServerSession(); - ServerMessage.Mutable outMessage = binding.createCometdMessage(channel, serverSession, exchange.getOut()); + ServerMessage.Mutable outMessage + = binding.createCometdMessage(channel, serverSession, exchange.getMessage()); remote.deliver(serverSession, outMessage, Promise.noop()); } } finally { diff --git a/components/camel-crypto-pgp/src/main/java/org/apache/camel/converter/crypto/PGPKeyAccessDataFormat.java b/components/camel-crypto-pgp/src/main/java/org/apache/camel/converter/crypto/PGPKeyAccessDataFormat.java index 36fca4cee3b22..1cabdbb79e3de 100644 --- a/components/camel-crypto-pgp/src/main/java/org/apache/camel/converter/crypto/PGPKeyAccessDataFormat.java +++ b/components/camel-crypto-pgp/src/main/java/org/apache/camel/converter/crypto/PGPKeyAccessDataFormat.java @@ -221,7 +221,7 @@ public void marshal(Exchange exchange, Object graph, OutputStream outputStream) "Cannot PGP encrypt message. No public encryption key found for the User Ids " + userids + " in the public keyring. Either specify other User IDs or add correct public keys to the keyring."); } - exchange.getOut().setHeader(NUMBER_OF_ENCRYPTION_KEYS, Integer.valueOf(keys.size())); + exchange.getMessage().setHeader(NUMBER_OF_ENCRYPTION_KEYS, Integer.valueOf(keys.size())); InputStream input = ExchangeHelper.convertToMandatoryType(exchange, InputStream.class, graph); @@ -336,7 +336,7 @@ protected List createSignatureGenerator(Exchange exchange return null; } - exchange.getOut().setHeader(NUMBER_OF_SIGNING_KEYS, Integer.valueOf(sigSecretKeysWithPrivateKeyAndUserId.size())); + exchange.getMessage().setHeader(NUMBER_OF_SIGNING_KEYS, Integer.valueOf(sigSecretKeysWithPrivateKeyAndUserId.size())); List sigGens = new ArrayList<>(); for (PGPSecretKeyAndPrivateKeyAndUserId sigSecretKeyWithPrivateKeyAndUserId : sigSecretKeysWithPrivateKeyAndUserId) { diff --git a/components/camel-crypto/src/main/java/org/apache/camel/component/crypto/processor/SigningProcessor.java b/components/camel-crypto/src/main/java/org/apache/camel/component/crypto/processor/SigningProcessor.java index 32294c22a5537..0714da520991a 100644 --- a/components/camel-crypto/src/main/java/org/apache/camel/component/crypto/processor/SigningProcessor.java +++ b/components/camel-crypto/src/main/java/org/apache/camel/component/crypto/processor/SigningProcessor.java @@ -43,9 +43,7 @@ public void process(Exchange exchange) throws Exception { Message in = exchange.getIn(); clearMessageHeaders(in); - Message out = exchange.getOut(); - out.copyFrom(in); - out.setHeader(config.getSignatureHeaderName(), new Base64().encode(signature)); + exchange.getMessage().setHeader(config.getSignatureHeaderName(), new Base64().encode(signature)); } protected Signature initSignatureService(Exchange exchange) throws Exception { diff --git a/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsInvoker.java b/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsInvoker.java index 47f914aba77bc..066f78cf4b8dc 100644 --- a/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsInvoker.java +++ b/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsInvoker.java @@ -28,6 +28,7 @@ import org.apache.camel.ExchangePattern; import org.apache.camel.ExchangeTimedOutException; import org.apache.camel.RuntimeCamelException; +import org.apache.camel.support.ExchangeHelper; import org.apache.cxf.continuations.Continuation; import org.apache.cxf.continuations.ContinuationProvider; import org.apache.cxf.jaxrs.JAXRSInvoker; @@ -170,7 +171,7 @@ private org.apache.camel.Exchange prepareExchange( cxfExchange.put(org.apache.camel.Exchange.class, camelExchange); if (response != null) { - camelExchange.getOut().setBody(response); + ExchangeHelper.createResponse(camelExchange).setBody(response); } CxfRsBinding binding = endpoint.getBinding(); binding.populateExchangeFromCxfRsRequest(cxfExchange, camelExchange, method, paramArray); diff --git a/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java b/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java index 416f079cc10cb..1a3a4a800647b 100644 --- a/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java +++ b/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java @@ -383,7 +383,6 @@ protected void invokeHttpClient(Exchange exchange) throws Exception { private static void setResponse(Exchange exchange, Object response, CxfRsBinding binding, int statesCode) throws Exception { LOG.trace("Response body = {}", response); - exchange.getOut().getHeaders().putAll(exchange.getIn().getHeaders()); exchange.getMessage().setBody(binding.bindResponseToCamelBody(response, exchange)); exchange.getMessage().getHeaders().putAll(binding.bindResponseHeadersToCamelHeaders(response, exchange)); exchange.getMessage().setHeader(CxfConstants.HTTP_RESPONSE_CODE, statesCode); diff --git a/components/camel-cxf/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/transport/message/DefaultCxfMessageMapper.java b/components/camel-cxf/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/transport/message/DefaultCxfMessageMapper.java index 6395a90a9e030..af5ef01ea6496 100644 --- a/components/camel-cxf/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/transport/message/DefaultCxfMessageMapper.java +++ b/components/camel-cxf/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/transport/message/DefaultCxfMessageMapper.java @@ -107,9 +107,7 @@ public void propagateResponseHeadersToCamel( return; } - Map camelHeaders = exchange.getOut().getHeaders(); - // copy the in message header to out message - camelHeaders.putAll(exchange.getIn().getHeaders()); + Map camelHeaders = exchange.getMessage().getHeaders(); Map> cxfHeaders = CastUtils.cast((Map) cxfMessage.get(Message.PROTOCOL_HEADERS)); diff --git a/components/camel-exec/src/main/java/org/apache/camel/component/exec/impl/DefaultExecBinding.java b/components/camel-exec/src/main/java/org/apache/camel/component/exec/impl/DefaultExecBinding.java index 6957bf07d44b9..3bbe5797dc322 100644 --- a/components/camel-exec/src/main/java/org/apache/camel/component/exec/impl/DefaultExecBinding.java +++ b/components/camel-exec/src/main/java/org/apache/camel/component/exec/impl/DefaultExecBinding.java @@ -114,12 +114,7 @@ public void writeOutput(Exchange exchange, ExecResult result) { ObjectHelper.notNull(exchange, "exchange"); ObjectHelper.notNull(result, "result"); - if (exchange.getPattern().isOutCapable()) { - writeOutputInMessage(exchange.getOut(), result); - exchange.getOut().getHeaders().putAll(exchange.getIn().getHeaders()); - } else { - writeOutputInMessage(exchange.getIn(), result); - } + writeOutputInMessage(exchange.getMessage(), result); } /** diff --git a/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFile.java b/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFile.java index 322f5a6177252..c05179d76a4e8 100644 --- a/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFile.java +++ b/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFile.java @@ -25,6 +25,7 @@ import org.apache.camel.Exchange; import org.apache.camel.ExchangePropertyKey; import org.apache.camel.WrappedFile; +import org.apache.camel.support.ExchangeHelper; import org.apache.camel.util.FileUtil; import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.StringHelper; @@ -133,8 +134,8 @@ private GenericFileMessage commonBindToExchange(Exchange exchange) { headers = exchange.getMessage().hasHeaders() ? exchange.getMessage().getHeaders() : null; // force storing on IN as that is what Camel expects exchange.setIn(msg); - if (exchange.hasOut()) { - exchange.setOut(null); + if (ExchangeHelper.hasResponse(exchange)) { + ExchangeHelper.setResponse(exchange, null); } // preserve any existing (non file) headers, before we re-populate diff --git a/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopProducer.java b/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopProducer.java index 89c8f58084257..45930a5747e7b 100644 --- a/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopProducer.java +++ b/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopProducer.java @@ -64,10 +64,7 @@ public void process(Exchange exchange) throws Exception { Source src = exchange.getIn().getBody(StreamSource.class); OutputStream out = transform(userAgent, outputFormat, src); - exchange.getOut().setBody(out); - - // propagate headers - exchange.getOut().setHeaders(headers); + exchange.getMessage().setBody(out); } private String getOutputFormat(Exchange exchange) { diff --git a/components/camel-github/src/main/java/org/apache/camel/component/github/producer/CreateIssueProducer.java b/components/camel-github/src/main/java/org/apache/camel/component/github/producer/CreateIssueProducer.java index 65da3ecc79dad..6134520f8b122 100644 --- a/components/camel-github/src/main/java/org/apache/camel/component/github/producer/CreateIssueProducer.java +++ b/components/camel-github/src/main/java/org/apache/camel/component/github/producer/CreateIssueProducer.java @@ -57,9 +57,7 @@ public void process(Exchange exchange) throws Exception { Issue finalIssue = issueService.createIssue(getRepository(), issue); - // copy the header of in message to the out message - exchange.getOut().copyFrom(exchange.getIn()); - exchange.getOut().setBody(finalIssue); + exchange.getMessage().setBody(finalIssue); } } diff --git a/components/camel-github/src/main/java/org/apache/camel/component/github/producer/GetCommitFileProducer.java b/components/camel-github/src/main/java/org/apache/camel/component/github/producer/GetCommitFileProducer.java index d46684ec6033b..ad06a1efbf7b4 100644 --- a/components/camel-github/src/main/java/org/apache/camel/component/github/producer/GetCommitFileProducer.java +++ b/components/camel-github/src/main/java/org/apache/camel/component/github/producer/GetCommitFileProducer.java @@ -76,9 +76,7 @@ public void process(Exchange exchange) throws Exception { text = new String(Base64.decodeBase64(text)); } - // copy the header of in message to the out message - exchange.getOut().copyFrom(exchange.getIn()); - exchange.getOut().setBody(text); + exchange.getMessage().setBody(text); } } diff --git a/components/camel-github/src/main/java/org/apache/camel/component/github/producer/PullRequestFilesProducer.java b/components/camel-github/src/main/java/org/apache/camel/component/github/producer/PullRequestFilesProducer.java index 50131e3eae2c7..0b7ef5a095ed0 100644 --- a/components/camel-github/src/main/java/org/apache/camel/component/github/producer/PullRequestFilesProducer.java +++ b/components/camel-github/src/main/java/org/apache/camel/component/github/producer/PullRequestFilesProducer.java @@ -55,9 +55,7 @@ public void process(Exchange exchange) throws Exception { java.util.List response = pullRequestService.getFiles(getRepository(), pullRequestNumber); - // copy the header of in message to the out message - exchange.getOut().copyFrom(exchange.getIn()); - exchange.getOut().setBody(response); + exchange.getMessage().setBody(response); } } diff --git a/components/camel-github/src/main/java/org/apache/camel/component/github/producer/PullRequestStateProducer.java b/components/camel-github/src/main/java/org/apache/camel/component/github/producer/PullRequestStateProducer.java index cea6e99d4ffbf..ddc29e9bfeda3 100644 --- a/components/camel-github/src/main/java/org/apache/camel/component/github/producer/PullRequestStateProducer.java +++ b/components/camel-github/src/main/java/org/apache/camel/component/github/producer/PullRequestStateProducer.java @@ -78,9 +78,7 @@ public void process(Exchange exchange) throws Exception { CommitStatus response = commitService.createStatus(getRepository(), pullRequestNumberSHA, status); - // copy the header of in message to the out message - exchange.getOut().copyFrom(exchange.getIn()); - exchange.getOut().setBody(response); + exchange.getMessage().setBody(response); } } diff --git a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7DataFormat.java b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7DataFormat.java index 64f40446838d5..e1a1fe2631ee8 100644 --- a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7DataFormat.java +++ b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7DataFormat.java @@ -131,13 +131,13 @@ public Object unmarshal(Exchange exchange, InputStream inputStream) throws Excep String bodyAsString = new String(body, charsetName); Message message = parser.parse(bodyAsString); - // add MSH fields as message out headers + // add MSH fields as message headers Terser terser = new Terser(message); for (Map.Entry entry : HEADER_MAP.entrySet()) { - exchange.getOut().setHeader(entry.getKey(), terser.get(entry.getValue())); + exchange.getMessage().setHeader(entry.getKey(), terser.get(entry.getValue())); } - exchange.getOut().setHeader(HL7_CONTEXT, hapiContext); - exchange.getOut().setHeader(Exchange.CHARSET_NAME, charsetName); + exchange.getMessage().setHeader(HL7_CONTEXT, hapiContext); + exchange.getMessage().setHeader(Exchange.CHARSET_NAME, charsetName); return message; } diff --git a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java index 8931a5607fa3b..0cedfe5d783cd 100644 --- a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java +++ b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java @@ -354,7 +354,8 @@ protected void populateResponse( HeaderFilterStrategy strategy, int responseCode) throws IOException, ClassNotFoundException { - Message answer = exchange.getOut(); + // separate response from request so response headers don't mix with request headers + Message answer = ExchangeHelper.createResponse(exchange); populateResponseCode(answer, httpResponse, responseCode); // We just make the out message is not create when extractResponseBody throws exception diff --git a/components/camel-influxdb/src/main/java/org/apache/camel/component/influxdb/InfluxDbProducer.java b/components/camel-influxdb/src/main/java/org/apache/camel/component/influxdb/InfluxDbProducer.java index de98bff06eeb9..14ecc5d563bf4 100644 --- a/components/camel-influxdb/src/main/java/org/apache/camel/component/influxdb/InfluxDbProducer.java +++ b/components/camel-influxdb/src/main/java/org/apache/camel/component/influxdb/InfluxDbProducer.java @@ -19,7 +19,6 @@ import org.apache.camel.Exchange; import org.apache.camel.InvalidPayloadException; import org.apache.camel.support.DefaultProducer; -import org.apache.camel.support.MessageHelper; import org.apache.camel.util.ObjectHelper; import org.influxdb.InfluxDB; import org.influxdb.dto.BatchPoints; @@ -99,13 +98,11 @@ private void doQuery(Exchange exchange, String dataBaseName) { String query = calculateQuery(exchange); Query influxdbQuery = new Query(query, dataBaseName); QueryResult resultSet = connection.query(influxdbQuery); - MessageHelper.copyHeaders(exchange.getIn(), exchange.getOut(), true); exchange.getMessage().setBody(resultSet); } private void doPing(Exchange exchange) { Pong result = connection.ping(); - MessageHelper.copyHeaders(exchange.getIn(), exchange.getOut(), true); exchange.getMessage().setBody(result); } diff --git a/components/camel-influxdb2/src/main/java/org/apache/camel/component/influxdb2/InfluxDb2Producer.java b/components/camel-influxdb2/src/main/java/org/apache/camel/component/influxdb2/InfluxDb2Producer.java index 417414a552d00..469ec5035b5c7 100644 --- a/components/camel-influxdb2/src/main/java/org/apache/camel/component/influxdb2/InfluxDb2Producer.java +++ b/components/camel-influxdb2/src/main/java/org/apache/camel/component/influxdb2/InfluxDb2Producer.java @@ -28,7 +28,6 @@ import org.apache.camel.component.influxdb2.data.Record; import org.apache.camel.component.influxdb2.data.Records; import org.apache.camel.support.DefaultProducer; -import org.apache.camel.support.MessageHelper; import org.apache.camel.util.ObjectHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -174,7 +173,6 @@ private void insertRecords(Exchange exchange, String orgName, String bucketName, private void doPing(Exchange exchange) { Boolean result = connection.ping(); - MessageHelper.copyHeaders(exchange.getIn(), exchange.getOut(), true); exchange.getMessage().setBody(result); } diff --git a/components/camel-ironmq/src/main/java/org/apache/camel/component/ironmq/IronMQProducer.java b/components/camel-ironmq/src/main/java/org/apache/camel/component/ironmq/IronMQProducer.java index 4103a21af1a74..0bb4466c92955 100644 --- a/components/camel-ironmq/src/main/java/org/apache/camel/component/ironmq/IronMQProducer.java +++ b/components/camel-ironmq/src/main/java/org/apache/camel/component/ironmq/IronMQProducer.java @@ -64,13 +64,7 @@ public void process(Exchange exchange) throws Exception { } private Message getMessageForResponse(Exchange exchange) { - if (exchange.getPattern().isOutCapable()) { - Message out = exchange.getOut(); - out.copyFrom(exchange.getIn()); - return out; - } - - return exchange.getIn(); + return exchange.getMessage(); } @Override diff --git a/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrProducer.java b/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrProducer.java index c7f3c5aa86b8a..2502d8037a7ab 100644 --- a/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrProducer.java +++ b/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrProducer.java @@ -35,6 +35,7 @@ import org.apache.camel.RuntimeCamelException; import org.apache.camel.TypeConverter; import org.apache.camel.support.DefaultProducer; +import org.apache.camel.support.ExchangeHelper; import org.apache.camel.util.ObjectHelper; import org.apache.jackrabbit.util.Text; @@ -66,7 +67,7 @@ public void process(Exchange exchange) throws Exception { } } node.addMixin("mix:referenceable"); - exchange.getOut().setBody(node.getIdentifier()); + ExchangeHelper.createResponse(exchange).setBody(node.getIdentifier()); session.save(); } else if (JcrConstants.JCR_GET_BY_ID.equals(operation)) { Node node = session.getNodeByIdentifier(exchange.getIn() diff --git a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsProducer.java b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsProducer.java index 0db06aba2d338..1eab129158f4f 100644 --- a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsProducer.java +++ b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsProducer.java @@ -40,6 +40,7 @@ import org.apache.camel.component.jms.reply.UseMessageIdAsCorrelationIdMessageSentCallback; import org.apache.camel.spi.UuidGenerator; import org.apache.camel.support.DefaultAsyncProducer; +import org.apache.camel.support.ExchangeHelper; import org.apache.camel.support.service.ServiceHelper; import org.apache.camel.util.ObjectHelper; import org.slf4j.Logger; @@ -474,10 +475,9 @@ protected Destination resolveOrCreateDestination(String destinationName, Session } protected void setMessageId(Exchange exchange) { - if (exchange.hasOut()) { - JmsMessage out = exchange.getOut(JmsMessage.class); + if (ExchangeHelper.getResponse(exchange) instanceof JmsMessage out) { try { - if (out != null && out.getJmsMessage() != null) { + if (out.getJmsMessage() != null) { out.setMessageId(out.getJmsMessage().getJMSMessageID()); } } catch (JMSException e) { diff --git a/components/camel-jms/src/main/java/org/apache/camel/component/jms/reply/ReplyManagerSupport.java b/components/camel-jms/src/main/java/org/apache/camel/component/jms/reply/ReplyManagerSupport.java index 54e73ddb26015..457b939e2e32f 100644 --- a/components/camel-jms/src/main/java/org/apache/camel/component/jms/reply/ReplyManagerSupport.java +++ b/components/camel-jms/src/main/java/org/apache/camel/component/jms/reply/ReplyManagerSupport.java @@ -198,7 +198,7 @@ private void handleSuccessfulReply(ReplyHolder holder, Exchange exchange) { Message message = holder.getMessage(); Session session = holder.getSession(); JmsMessage response = new JmsMessage(exchange, message, session, endpoint.getBinding()); - exchange.setOut(response); + ExchangeHelper.setResponse(exchange, response); Object to = exchange.getIn().getHeader(JmsConstants.JMS_DESTINATION_NAME_PRODUCED); if (to != null) { @@ -219,7 +219,7 @@ private void handleSuccessfulReply(ReplyHolder holder, Exchange exchange) { private void restoreOriginalCorrelationId(ReplyHolder holder, Exchange exchange, Message message) { if (holder.getOriginalCorrelationId() != null) { JmsMessageHelper.setCorrelationId(message, holder.getOriginalCorrelationId()); - exchange.getOut().setHeader(JmsConstants.JMS_HEADER_CORRELATION_ID, holder.getOriginalCorrelationId()); + exchange.getMessage().setHeader(JmsConstants.JMS_HEADER_CORRELATION_ID, holder.getOriginalCorrelationId()); } } diff --git a/components/camel-jooq/src/main/java/org/apache/camel/component/jooq/JooqProducer.java b/components/camel-jooq/src/main/java/org/apache/camel/component/jooq/JooqProducer.java index a31d16438429f..a9fbb5011bbf5 100644 --- a/components/camel-jooq/src/main/java/org/apache/camel/component/jooq/JooqProducer.java +++ b/components/camel-jooq/src/main/java/org/apache/camel/component/jooq/JooqProducer.java @@ -18,7 +18,6 @@ import org.apache.camel.Exchange; import org.apache.camel.Expression; -import org.apache.camel.Message; import org.apache.camel.support.DefaultProducer; import org.apache.camel.util.ObjectHelper; import org.jooq.Configuration; @@ -71,8 +70,7 @@ public void process(Exchange exchange) { result = context.fetch(querySQL); } - Message target = exchange.getPattern().isOutCapable() ? exchange.getOut() : exchange.getIn(); - target.setBody(result); + exchange.getMessage().setBody(result); break; case NONE: DSLContext context = DSL.using(dbConfig); diff --git a/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaConsumer.java b/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaConsumer.java index cd019ec8977d9..5e5e64d4aafdf 100644 --- a/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaConsumer.java +++ b/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaConsumer.java @@ -30,7 +30,6 @@ import org.apache.camel.ExchangePropertyKey; import org.apache.camel.Processor; import org.apache.camel.support.DefaultConsumer; -import org.apache.camel.support.ExchangeHelper; import org.apache.camel.util.IOHelper; import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder; import org.apache.mina.core.filterchain.IoFilter; @@ -385,7 +384,7 @@ private Exchange createExchange(IoSession session, Object payload) { exchange.getIn().setHeader(MinaConstants.MINA_IOSESSION, session); exchange.getIn().setHeader(MinaConstants.MINA_LOCAL_ADDRESS, session.getLocalAddress()); exchange.getIn().setHeader(MinaConstants.MINA_REMOTE_ADDRESS, session.getRemoteAddress()); - MinaPayloadHelper.setIn(exchange, payload); + MinaPayloadHelper.setPayload(exchange, payload); return exchange; } @@ -440,12 +439,7 @@ public void messageReceived(IoSession session, Object object) throws Exception { // If there's a response to send, send it. // boolean disconnect = getEndpoint().getConfiguration().isDisconnect(); - Object response; - if (exchange.hasOut()) { - response = MinaPayloadHelper.getOut(getEndpoint(), exchange); - } else { - response = MinaPayloadHelper.getIn(getEndpoint(), exchange); - } + Object response = MinaPayloadHelper.getResponsePayload(getEndpoint(), exchange); boolean failed = exchange.isFailed(); if (failed && !getEndpoint().getConfiguration().isTransferExchange()) { @@ -453,7 +447,7 @@ public void messageReceived(IoSession session, Object object) throws Exception { response = exchange.getException(); } else { // failed and no exception, must be a fault - response = exchange.getOut().getBody(); + response = exchange.getMessage().getBody(); } } @@ -466,12 +460,8 @@ public void messageReceived(IoSession session, Object object) throws Exception { } // should session be closed after complete? - Boolean close; - if (ExchangeHelper.isOutCapable(exchange)) { - close = exchange.getOut().getHeader(MinaConstants.MINA_CLOSE_SESSION_WHEN_COMPLETE, Boolean.class); - } else { - close = exchange.getIn().getHeader(MinaConstants.MINA_CLOSE_SESSION_WHEN_COMPLETE, Boolean.class); - } + Boolean close + = exchange.getMessage().getHeader(MinaConstants.MINA_CLOSE_SESSION_WHEN_COMPLETE, Boolean.class); // should we disconnect, the header can override the configuration if (close != null) { diff --git a/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaPayloadHelper.java b/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaPayloadHelper.java index b786ca9f45fbb..e700ac0ccbaa3 100644 --- a/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaPayloadHelper.java +++ b/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaPayloadHelper.java @@ -32,7 +32,7 @@ private MinaPayloadHelper() { //Utility Class } - public static Object getIn(MinaEndpoint endpoint, Exchange exchange) { + public static Object getRequestPayload(MinaEndpoint endpoint, Exchange exchange) { if (endpoint.getConfiguration().isTransferExchange()) { // we should transfer the entire exchange over the wire (includes in/out) return DefaultExchangeHolder.marshal(exchange); @@ -42,32 +42,22 @@ public static Object getIn(MinaEndpoint endpoint, Exchange exchange) { } } - public static Object getOut(MinaEndpoint endpoint, Exchange exchange) { + public static Object getResponsePayload(MinaEndpoint endpoint, Exchange exchange) { if (endpoint.getConfiguration().isTransferExchange()) { // we should transfer the entire exchange over the wire (includes in/out) return DefaultExchangeHolder.marshal(exchange); } else { // normal transfer using the body only - return exchange.getOut().getBody(); + return exchange.getMessage().getBody(); } } - public static void setIn(Exchange exchange, Object payload) { + public static void setPayload(Exchange exchange, Object payload) { if (payload instanceof DefaultExchangeHolder) { DefaultExchangeHolder.unmarshal(exchange, (DefaultExchangeHolder) payload); } else { // normal transfer using the body only - exchange.getIn().setBody(payload); - } - } - - public static void setOut(Exchange exchange, Object payload) { - if (payload instanceof DefaultExchangeHolder) { - DefaultExchangeHolder.unmarshal(exchange, (DefaultExchangeHolder) payload); - } else { - // normal transfer using the body only and preserve the headers - exchange.getOut().setHeaders(exchange.getIn().getHeaders()); - exchange.getOut().setBody(payload); + exchange.getMessage().setBody(payload); } } } diff --git a/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaProducer.java b/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaProducer.java index ddb26027906d5..fb7815c706c0f 100644 --- a/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaProducer.java +++ b/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaProducer.java @@ -31,7 +31,6 @@ import org.apache.camel.ExchangeTimedOutException; import org.apache.camel.spi.CamelLogger; import org.apache.camel.support.DefaultProducer; -import org.apache.camel.support.ExchangeHelper; import org.apache.camel.util.IOHelper; import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder; import org.apache.mina.core.filterchain.IoFilter; @@ -136,7 +135,7 @@ protected void doProcess(Exchange exchange) throws Exception { IOHelper.normalizeCharset(getEndpoint().getConfiguration().getCharsetName())); } - Object body = MinaPayloadHelper.getIn(getEndpoint(), exchange); + Object body = MinaPayloadHelper.getRequestPayload(getEndpoint(), exchange); if (body == null) { noReplyLogger.log("No payload to send for exchange: " + exchange); return; // exit early since nothing to write @@ -184,12 +183,7 @@ protected void doProcess(Exchange exchange) throws Exception { maybeDisconnectOnTimeout(); throw new ExchangeTimedOutException(exchange, timeout); } else { - // set the result on either IN or OUT on the original exchange depending on its pattern - if (ExchangeHelper.isOutCapable(exchange)) { - MinaPayloadHelper.setOut(exchange, handler.getMessage()); - } else { - MinaPayloadHelper.setIn(exchange, handler.getMessage()); - } + MinaPayloadHelper.setPayload(exchange, handler.getMessage()); } } } @@ -210,12 +204,7 @@ protected void maybeDisconnectOnDone(Exchange exchange) throws InterruptedExcept } // should session be closed after complete? - Boolean close; - if (ExchangeHelper.isOutCapable(exchange)) { - close = exchange.getOut().getHeader(MinaConstants.MINA_CLOSE_SESSION_WHEN_COMPLETE, Boolean.class); - } else { - close = exchange.getIn().getHeader(MinaConstants.MINA_CLOSE_SESSION_WHEN_COMPLETE, Boolean.class); - } + Boolean close = exchange.getMessage().getHeader(MinaConstants.MINA_CLOSE_SESSION_WHEN_COMPLETE, Boolean.class); // should we disconnect, the header can override the configuration boolean disconnect = getEndpoint().getConfiguration().isDisconnect(); diff --git a/components/camel-mock/src/main/java/org/apache/camel/component/mock/MockExpressionClause.java b/components/camel-mock/src/main/java/org/apache/camel/component/mock/MockExpressionClause.java index 0138366f431e9..fa28b29fbadb6 100644 --- a/components/camel-mock/src/main/java/org/apache/camel/component/mock/MockExpressionClause.java +++ b/components/camel-mock/src/main/java/org/apache/camel/component/mock/MockExpressionClause.java @@ -125,7 +125,7 @@ public T outMessage(final Function function) { return delegate.expression(new ExpressionAdapter() { @Override public Object evaluate(Exchange exchange) { - return function.apply(exchange.getOut()); + return function.apply(exchange.getMessage()); } }); } @@ -215,7 +215,7 @@ public T outBody(final Function function) { return delegate.expression(new ExpressionAdapter() { @Override public Object evaluate(Exchange exchange) { - return function.apply(exchange.getOut().getBody()); + return function.apply(exchange.getMessage().getBody()); } }); } @@ -228,8 +228,8 @@ public T outBody(final BiFunction, Object> function) @Override public Object evaluate(Exchange exchange) { return function.apply( - exchange.getOut().getBody(), - exchange.getOut().getHeaders()); + exchange.getMessage().getBody(), + exchange.getMessage().getHeaders()); } }); } @@ -241,7 +241,7 @@ public T outBody(Class expectedType, final Function function) return delegate.expression(new ExpressionAdapter() { @Override public Object evaluate(Exchange exchange) { - return function.apply(exchange.getOut().getBody(expectedType)); + return function.apply(exchange.getMessage().getBody(expectedType)); } }); } @@ -254,8 +254,8 @@ public T outBody(Class expectedType, final BiFunction dp = (AddressedEnvelope) payload; - // need to check if the content is ExchangeHolder - if (dp.content() instanceof DefaultExchangeHolder defaultExchangeHolder) { - DefaultExchangeHolder.unmarshal(exchange, defaultExchangeHolder); - } else { - // need to take out the payload here - exchange.getOut().setBody(dp.content()); - } - // setup the sender address here for sending the response message back - exchange.setProperty(NettyConstants.NETTY_REMOTE_ADDRESS, dp.sender()); - } else { - // normal transfer using the body only and preserve the headers - exchange.getOut().setHeaders(exchange.getIn().getHeaders()); - exchange.getOut().setBody(payload); + exchange.getMessage().setBody(payload); } } diff --git a/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyProducer.java b/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyProducer.java index e3fc56afe4e79..7ce5b0832cb59 100644 --- a/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyProducer.java +++ b/components/camel-netty/src/main/java/org/apache/camel/component/netty/NettyProducer.java @@ -59,7 +59,6 @@ import org.apache.camel.ExchangePropertyKey; import org.apache.camel.spi.CamelLogger; import org.apache.camel.support.DefaultAsyncProducer; -import org.apache.camel.support.ExchangeHelper; import org.apache.camel.support.SynchronizationAdapter; import org.apache.camel.support.service.ServiceHelper; import org.apache.camel.util.IOHelper; @@ -304,12 +303,8 @@ public void processWithConnectedChannel( @Override public void onComplete(Exchange exchange) { // should channel be closed after complete? - Boolean close; - if (ExchangeHelper.isOutCapable(exchange)) { - close = exchange.getOut().getHeader(NettyConstants.NETTY_CLOSE_CHANNEL_WHEN_COMPLETE, Boolean.class); - } else { - close = exchange.getIn().getHeader(NettyConstants.NETTY_CLOSE_CHANNEL_WHEN_COMPLETE, Boolean.class); - } + Boolean close + = exchange.getMessage().getHeader(NettyConstants.NETTY_CLOSE_CHANNEL_WHEN_COMPLETE, Boolean.class); // should we disconnect, the header can override the configuration boolean disconnect = getConfiguration().isDisconnect(); @@ -393,13 +388,8 @@ public void operationComplete(ChannelFuture channelFuture) throws Exception { if (!configuration.isSync()) { try { // should channel be closed after complete? - Boolean close; - if (ExchangeHelper.isOutCapable(exchange)) { - close = exchange.getOut().getHeader(NettyConstants.NETTY_CLOSE_CHANNEL_WHEN_COMPLETE, - Boolean.class); - } else { - close = exchange.getIn().getHeader(NettyConstants.NETTY_CLOSE_CHANNEL_WHEN_COMPLETE, Boolean.class); - } + Boolean close = exchange.getMessage() + .getHeader(NettyConstants.NETTY_CLOSE_CHANNEL_WHEN_COMPLETE, Boolean.class); // should we disconnect, the header can override the configuration boolean disconnect = getConfiguration().isDisconnect(); @@ -433,7 +423,7 @@ public void operationComplete(ChannelFuture channelFuture) throws Exception { * @throws Exception is thrown if error getting the request body */ protected Object getRequestBody(Exchange exchange) throws Exception { - Object body = NettyPayloadHelper.getIn(getEndpoint(), exchange); + Object body = NettyPayloadHelper.getRequestPayload(getEndpoint(), exchange); if (body == null) { return null; } diff --git a/components/camel-netty/src/main/java/org/apache/camel/component/netty/handlers/ClientChannelHandler.java b/components/camel-netty/src/main/java/org/apache/camel/component/netty/handlers/ClientChannelHandler.java index 2205e096f57ee..abb703f1eda6f 100644 --- a/components/camel-netty/src/main/java/org/apache/camel/component/netty/handlers/ClientChannelHandler.java +++ b/components/camel-netty/src/main/java/org/apache/camel/component/netty/handlers/ClientChannelHandler.java @@ -28,6 +28,7 @@ import org.apache.camel.component.netty.NettyHelper; import org.apache.camel.component.netty.NettyPayloadHelper; import org.apache.camel.component.netty.NettyProducer; +import org.apache.camel.support.DefaultExchangeHolder; import org.apache.camel.support.ExchangeHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -187,19 +188,15 @@ protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Except // set the result on either IN or OUT on the original exchange depending on its pattern if (ExchangeHelper.isOutCapable(exchange)) { - exchange.setOut(message); + ExchangeHelper.setResponse(exchange, message); } else { exchange.setIn(message); } try { // should channel be closed after complete? - Boolean close; - if (ExchangeHelper.isOutCapable(exchange)) { - close = exchange.getOut().getHeader(NettyConstants.NETTY_CLOSE_CHANNEL_WHEN_COMPLETE, Boolean.class); - } else { - close = exchange.getIn().getHeader(NettyConstants.NETTY_CLOSE_CHANNEL_WHEN_COMPLETE, Boolean.class); - } + Boolean close + = exchange.getMessage().getHeader(NettyConstants.NETTY_CLOSE_CHANNEL_WHEN_COMPLETE, Boolean.class); // check the setting on the exchange property if (close == null) { @@ -257,10 +254,14 @@ protected Message getResponseMessage(Exchange exchange, ChannelHandlerContext ct // set the result on either IN or OUT on the original exchange depending on its pattern if (ExchangeHelper.isOutCapable(exchange)) { - NettyPayloadHelper.setOut(exchange, body); - return exchange.getOut(); + // DefaultExchangeHolder unmarshals its own OUT, so only pre-create one for normal payloads + if (!(body instanceof DefaultExchangeHolder)) { + ExchangeHelper.createResponseFromInput(exchange); + } + NettyPayloadHelper.setPayload(exchange, body); + return exchange.getMessage(); } else { - NettyPayloadHelper.setIn(exchange, body); + NettyPayloadHelper.setPayload(exchange, body); return exchange.getIn(); } } diff --git a/components/camel-netty/src/main/java/org/apache/camel/component/netty/handlers/ServerChannelHandler.java b/components/camel-netty/src/main/java/org/apache/camel/component/netty/handlers/ServerChannelHandler.java index a056028b8345f..913ecfdef73ca 100644 --- a/components/camel-netty/src/main/java/org/apache/camel/component/netty/handlers/ServerChannelHandler.java +++ b/components/camel-netty/src/main/java/org/apache/camel/component/netty/handlers/ServerChannelHandler.java @@ -116,7 +116,7 @@ protected Exchange createExchange(ChannelHandlerContext ctx, Object message) thr // must be prototype scoped (not pooled) so we create the exchange via endpoint Exchange exchange = consumer.createExchange(false); consumer.getEndpoint().updateMessageHeader(exchange.getIn(), ctx); - NettyPayloadHelper.setIn(exchange, message); + NettyPayloadHelper.setPayload(exchange, message); return exchange; } @@ -206,11 +206,7 @@ protected Object getResponseBody(Exchange exchange) throws Exception { if (exception) { return exchange.getException(); } - if (exchange.hasOut()) { - return NettyPayloadHelper.getOut(consumer.getEndpoint(), exchange); - } else { - return NettyPayloadHelper.getIn(consumer.getEndpoint(), exchange); - } + return NettyPayloadHelper.getResponsePayload(consumer.getEndpoint(), exchange); } /** diff --git a/components/camel-netty/src/main/java/org/apache/camel/component/netty/handlers/ServerResponseFutureListener.java b/components/camel-netty/src/main/java/org/apache/camel/component/netty/handlers/ServerResponseFutureListener.java index b967d465fc4a0..ad7c73a2a422c 100644 --- a/components/camel-netty/src/main/java/org/apache/camel/component/netty/handlers/ServerResponseFutureListener.java +++ b/components/camel-netty/src/main/java/org/apache/camel/component/netty/handlers/ServerResponseFutureListener.java @@ -54,12 +54,7 @@ public void operationComplete(ChannelFuture future) throws Exception { } // should channel be closed after complete? - Boolean close; - if (exchange.hasOut()) { - close = exchange.getOut().getHeader(NettyConstants.NETTY_CLOSE_CHANNEL_WHEN_COMPLETE, Boolean.class); - } else { - close = exchange.getIn().getHeader(NettyConstants.NETTY_CLOSE_CHANNEL_WHEN_COMPLETE, Boolean.class); - } + Boolean close = exchange.getMessage().getHeader(NettyConstants.NETTY_CLOSE_CHANNEL_WHEN_COMPLETE, Boolean.class); // check the setting on the exchange property if (close == null) { diff --git a/components/camel-ognl/src/main/java/org/apache/camel/language/ognl/RootObject.java b/components/camel-ognl/src/main/java/org/apache/camel/language/ognl/RootObject.java index f1ba1722330db..6fb9452e2f8e7 100644 --- a/components/camel-ognl/src/main/java/org/apache/camel/language/ognl/RootObject.java +++ b/components/camel-ognl/src/main/java/org/apache/camel/language/ognl/RootObject.java @@ -49,6 +49,7 @@ public Message getRequest() { return exchange.getIn(); } + @SuppressWarnings("deprecation") @Deprecated public Message getResponse() { return exchange.getOut(); diff --git a/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Producer.java b/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Producer.java index b284e71985c4c..c77d24945e7fc 100644 --- a/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Producer.java +++ b/components/camel-olingo2/camel-olingo2-component/src/main/java/org/apache/camel/component/olingo2/Olingo2Producer.java @@ -65,12 +65,10 @@ public void onResponse(Object response, Map responseHeaders) { // producer returns a single response, even for methods with // List return types - exchange.getOut().setBody(response); - // copy headers - exchange.getOut().setHeaders(exchange.getIn().getHeaders()); + exchange.getMessage().setBody(response); // Add http response headers - exchange.getOut().setHeader(Olingo2Constants.RESPONSE_HTTP_HEADERS, responseHeaders); + exchange.getMessage().setHeader(Olingo2Constants.RESPONSE_HTTP_HEADERS, responseHeaders); interceptResult(response, exchange); diff --git a/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Producer.java b/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Producer.java index 19de5512ab71a..a4e0773a4f134 100644 --- a/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Producer.java +++ b/components/camel-olingo4/camel-olingo4-component/src/main/java/org/apache/camel/component/olingo4/Olingo4Producer.java @@ -65,12 +65,10 @@ public void onResponse(Object response, Map responseHeaders) { // producer returns a single response, even for methods with // List return types - exchange.getOut().setBody(response); - // copy headers - exchange.getOut().setHeaders(exchange.getIn().getHeaders()); + exchange.getMessage().setBody(response); // Add http response headers - exchange.getOut().setHeader(Olingo4Constants.FULL_RESPONSE_HTTP_HEADERS, responseHeaders); + exchange.getMessage().setHeader(Olingo4Constants.FULL_RESPONSE_HTTP_HEADERS, responseHeaders); interceptResult(response, exchange); diff --git a/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjConsumer.java b/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjConsumer.java index bfbb90657365e..f903e059551ae 100644 --- a/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjConsumer.java +++ b/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjConsumer.java @@ -21,6 +21,7 @@ import org.apache.camel.Message; import org.apache.camel.Processor; import org.apache.camel.support.DefaultConsumer; +import org.apache.camel.support.ExchangeHelper; import org.quickfixj.QFJException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -58,7 +59,7 @@ public void onExchange(Exchange exchange) { try { getProcessor().process(exchange); - if (exchange.getPattern().isOutCapable() && exchange.hasOut()) { + if (exchange.getPattern().isOutCapable() && ExchangeHelper.hasResponse(exchange)) { sendOutMessage(exchange); } } catch (Exception e) { diff --git a/components/camel-reactive-streams/src/main/java/org/apache/camel/component/reactive/streams/util/UnwrapStreamProcessor.java b/components/camel-reactive-streams/src/main/java/org/apache/camel/component/reactive/streams/util/UnwrapStreamProcessor.java index 705b173618725..319924fab8caf 100644 --- a/components/camel-reactive-streams/src/main/java/org/apache/camel/component/reactive/streams/util/UnwrapStreamProcessor.java +++ b/components/camel-reactive-streams/src/main/java/org/apache/camel/component/reactive/streams/util/UnwrapStreamProcessor.java @@ -22,6 +22,7 @@ import org.apache.camel.AsyncCallback; import org.apache.camel.Exchange; import org.apache.camel.support.AsyncProcessorSupport; +import org.apache.camel.support.ExchangeHelper; import org.reactivestreams.Publisher; import org.reactivestreams.Subscriber; import org.reactivestreams.Subscription; @@ -79,8 +80,8 @@ private void addData() { Exchange copy = (Exchange) body; exchange.setException(copy.getException()); exchange.setIn(copy.getIn()); - if (copy.hasOut()) { - exchange.setOut(copy.getOut()); + if (ExchangeHelper.hasResponse(copy)) { + ExchangeHelper.setResponse(exchange, copy.getMessage()); } exchange.getProperties().clear(); exchange.getProperties().putAll(copy.getProperties()); diff --git a/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestProducerBindingProcessor.java b/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestProducerBindingProcessor.java index 4eba8c7f8ee29..6cf3a1965e103 100644 --- a/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestProducerBindingProcessor.java +++ b/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestProducerBindingProcessor.java @@ -317,8 +317,7 @@ private void doDone() { } // is the body empty - if (exchange.hasOut() && exchange.getOut().getBody() == null - || !exchange.hasOut() && exchange.getIn().getBody() == null) { + if (exchange.getMessage().getBody() == null) { return; } diff --git a/components/camel-rocketmq/src/main/java/org/apache/camel/component/rocketmq/reply/RocketMQReplyManagerSupport.java b/components/camel-rocketmq/src/main/java/org/apache/camel/component/rocketmq/reply/RocketMQReplyManagerSupport.java index ec2b025d5d824..f573808f0d586 100644 --- a/components/camel-rocketmq/src/main/java/org/apache/camel/component/rocketmq/reply/RocketMQReplyManagerSupport.java +++ b/components/camel-rocketmq/src/main/java/org/apache/camel/component/rocketmq/reply/RocketMQReplyManagerSupport.java @@ -171,7 +171,7 @@ public void processReply(ReplyHolder holder) { } private static void processReceivedReply(ReplyHolder holder) { - Message message = holder.getExchange().getOut(); + Message message = holder.getExchange().getMessage(); MessageExt messageExt = holder.getMessageExt(); message.setBody(messageExt.getBody()); RocketMQMessageConverter.populateHeadersByMessageExt(message, messageExt); diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/AnalyticsApiProcessor.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/AnalyticsApiProcessor.java index 27a56375a125d..ef49c38e121e6 100644 --- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/AnalyticsApiProcessor.java +++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/AnalyticsApiProcessor.java @@ -216,18 +216,14 @@ public void onResponse( private void processResponse( Exchange exchange, Object body, Map headers, SalesforceException ex, AsyncCallback callback) { - final Message out = exchange.getOut(); + final Message message = exchange.getMessage(); if (ex != null) { exchange.setException(ex); } else { - out.setBody(body); + message.setBody(body); } - // copy headers - final Message inboundMessage = exchange.getIn(); - final Map outputHeaders = out.getHeaders(); - outputHeaders.putAll(inboundMessage.getHeaders()); - outputHeaders.putAll(headers); + message.getHeaders().putAll(headers); // signal exchange completion callback.done(false); diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/BulkApiProcessor.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/BulkApiProcessor.java index 8e44584ebfdb6..22c58fc459b50 100644 --- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/BulkApiProcessor.java +++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/BulkApiProcessor.java @@ -451,18 +451,14 @@ public void onResponse(InputStream inputStream, Map headers, Sal private void processResponse( Exchange exchange, Object body, Map headers, SalesforceException ex, AsyncCallback callback) { - final Message out = exchange.getOut(); + final Message message = exchange.getMessage(); if (ex != null) { exchange.setException(ex); } else { - out.setBody(body); + message.setBody(body); } - // copy headers - Message inboundMessage = exchange.getIn(); - Map outboundHeaders = out.getHeaders(); - outboundHeaders.putAll(inboundMessage.getHeaders()); - outboundHeaders.putAll(headers); + message.getHeaders().putAll(headers); // signal exchange completion callback.done(false); diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/CompositeApiProcessor.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/CompositeApiProcessor.java index eb28d8722df9c..6441650681cb1 100644 --- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/CompositeApiProcessor.java +++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/CompositeApiProcessor.java @@ -108,13 +108,12 @@ void processCompositeBatchResponse( if (!responseBody.isPresent()) { exchange.setException(exception); } else { - final Message in = exchange.getIn(); - final Message out = exchange.getOut(); + final Message message = exchange.getMessage(); final SObjectBatchResponse response = responseBody.get(); - out.copyFromWithNewBody(in, response); - out.getHeaders().putAll(headers); + message.setBody(response); + message.getHeaders().putAll(headers); } } finally { // notify callback that exchange is done @@ -129,13 +128,12 @@ void processCompositeResponseRaw( if (!responseBody.isPresent()) { exchange.setException(exception); } else { - final Message in = exchange.getIn(); - final Message out = exchange.getOut(); + final Message message = exchange.getMessage(); final InputStream response = responseBody.get(); - out.copyFromWithNewBody(in, response); - out.getHeaders().putAll(headers); + message.setBody(response); + message.getHeaders().putAll(headers); } } finally { // notify callback that exchange is done @@ -150,13 +148,12 @@ void processCompositeResponse( if (!responseBody.isPresent()) { exchange.setException(exception); } else { - final Message in = exchange.getIn(); - final Message out = exchange.getOut(); + final Message message = exchange.getMessage(); final SObjectCompositeResponse response = responseBody.get(); - out.copyFromWithNewBody(in, response); - out.getHeaders().putAll(headers); + message.setBody(response); + message.getHeaders().putAll(headers); } } finally { // notify callback that exchange is done @@ -172,11 +169,9 @@ void processCompositeTreeResponse( if (!responseBody.isPresent()) { exchange.setException(exception); } else { + final Message message = exchange.getMessage(); - final Message in = exchange.getIn(); - final Message out = exchange.getOut(); - - final SObjectTree tree = in.getBody(SObjectTree.class); + final SObjectTree tree = message.getBody(SObjectTree.class); final SObjectTreeResponse response = responseBody.get(); @@ -196,8 +191,8 @@ void processCompositeTreeResponse( exchange.setException(withErrors); } - out.copyFromWithNewBody(in, tree); - out.getHeaders().putAll(headers); + message.setBody(tree); + message.getHeaders().putAll(headers); } } finally { // notify callback that exchange is done diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/CompositeSObjectCollectionsProcessor.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/CompositeSObjectCollectionsProcessor.java index 4627a02d830e1..c24bcbfaad5f2 100644 --- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/CompositeSObjectCollectionsProcessor.java +++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/CompositeSObjectCollectionsProcessor.java @@ -175,11 +175,10 @@ private void processResponse( if (exception != null) { exchange.setException(exception); } else { - Message in = exchange.getIn(); - Message out = exchange.getOut(); + Message message = exchange.getMessage(); List response = responseBody.get(); - out.copyFromWithNewBody(in, response); - out.getHeaders().putAll(headers); + message.setBody(response); + message.getHeaders().putAll(headers); } } finally { callback.done(false); diff --git a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/JsonRestProcessor.java b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/JsonRestProcessor.java index a06da2bfdcf9d..34ca114a52735 100644 --- a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/JsonRestProcessor.java +++ b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/internal/processor/JsonRestProcessor.java @@ -183,17 +183,15 @@ protected void processResponse( // process JSON response for TypeReference try { - final Message out = exchange.getOut(); - final Message in = exchange.getIn(); - out.copyFrom(in); - out.getHeaders().putAll(headers); + final Message message = exchange.getMessage(); + message.getHeaders().putAll(headers); if (ex != null) { // if an exception is reported we should not lose it if (shouldReport(ex)) { exchange.setException(ex); } else { - out.setBody(null); + message.setBody(null); } } else if (responseEntity != null) { // do we need to un-marshal a response @@ -213,7 +211,7 @@ protected void processResponse( response = responseEntity; } } - out.setBody(response); + message.setBody(response); } } catch (IOException e) { String msg = "Error parsing JSON response: " + e.getMessage(); @@ -265,28 +263,26 @@ protected void processStreamResultResponse( AsyncCallback callback) { // process JSON response for TypeReference try { - final Message out = exchange.getOut(); - final Message in = exchange.getIn(); - out.copyFrom(in); - out.getHeaders().putAll(headers); + final Message message = exchange.getMessage(); + message.getHeaders().putAll(headers); if (ex != null) { // if an exception is reported we should not lose it if (shouldReport(ex)) { exchange.setException(ex); } else { - out.setBody(null); + message.setBody(null); } } else if (responseEntity != null) { // do we need to un-marshal a response final AbstractQueryRecordsBase response; Class responseClass = exchange.getProperty(RESPONSE_CLASS, Class.class); response = (AbstractQueryRecordsBase) objectMapper.readValue(responseEntity, responseClass); - out.setHeader(HEADER_SALESFORCE_QUERY_RESULT_TOTAL_SIZE, response.getTotalSize()); + message.setHeader(HEADER_SALESFORCE_QUERY_RESULT_TOTAL_SIZE, response.getTotalSize()); QueryResultIterator iterator = new QueryResultIterator( objectMapper, responseClass, restClient, determineHeaders(exchange), response); - out.setBody(iterator); + message.setBody(iterator); } } catch (Exception e) { String msg = "Error parsing JSON response: " + e.getMessage(); diff --git a/components/camel-sap-netweaver/src/main/java/org/apache/camel/component/sap/netweaver/NetWeaverProducer.java b/components/camel-sap-netweaver/src/main/java/org/apache/camel/component/sap/netweaver/NetWeaverProducer.java index 9ff7fa8cd3d03..87546fa3ab0a1 100644 --- a/components/camel-sap-netweaver/src/main/java/org/apache/camel/component/sap/netweaver/NetWeaverProducer.java +++ b/components/camel-sap-netweaver/src/main/java/org/apache/camel/component/sap/netweaver/NetWeaverProducer.java @@ -57,7 +57,7 @@ public void process(Exchange exchange) throws Exception { LOG.debug("Calling SAP Net-Weaver {} with command {}", http, command); http.process(httpExchange); - String data = httpExchange.getOut().getBody(String.class); + String data = httpExchange.getMessage().getBody(String.class); if (data != null && getEndpoint().isJsonAsMap() && getEndpoint().isJson()) { // map json string to json map diff --git a/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryBuilder.java b/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryBuilder.java index c6e0691da4be8..6e589411e01b6 100644 --- a/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryBuilder.java +++ b/components/camel-saxon/src/main/java/org/apache/camel/component/xquery/XQueryBuilder.java @@ -65,12 +65,14 @@ import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.Expression; +import org.apache.camel.Message; import org.apache.camel.NoTypeConversionAvailableException; import org.apache.camel.Predicate; import org.apache.camel.Processor; import org.apache.camel.RuntimeCamelException; import org.apache.camel.RuntimeExpressionException; import org.apache.camel.spi.NamespaceAware; +import org.apache.camel.support.ExchangeHelper; import org.apache.camel.support.MessageHelper; import org.apache.camel.util.IOHelper; import org.apache.camel.util.ObjectHelper; @@ -658,12 +660,13 @@ protected void configureQuery(DynamicQueryContext dynamicQueryContext, Exchange dynamicQueryContext.setParameter( StructuredQName.fromClarkName("exchange"), getAsParameter(exchange)); - if (exchange.hasOut() && exchange.getPattern().isOutCapable()) { + Message response = ExchangeHelper.getResponse(exchange); + if (response != null && exchange.getPattern().isOutCapable()) { dynamicQueryContext.setParameter( StructuredQName.fromClarkName("out.body"), - getAsParameter(exchange.getOut().getBody())); + getAsParameter(response.getBody())); - addParameters(dynamicQueryContext, exchange.getOut().getHeaders(), "out.headers."); + addParameters(dynamicQueryContext, response.getHeaders(), "out.headers."); } } diff --git a/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsProducer.java b/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsProducer.java index 8e24ea906c20a..db731b55c00c7 100644 --- a/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsProducer.java +++ b/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsProducer.java @@ -39,6 +39,7 @@ import org.apache.camel.component.sjms.reply.TemporaryQueueReplyManager; import org.apache.camel.spi.UuidGenerator; import org.apache.camel.support.DefaultAsyncProducer; +import org.apache.camel.support.ExchangeHelper; import org.apache.camel.support.service.ServiceHelper; import org.apache.camel.util.ObjectHelper; import org.slf4j.Logger; @@ -433,10 +434,9 @@ public Message createMessage(Session session) throws JMSException { } protected void setMessageId(Exchange exchange) { - if (exchange.hasOut()) { - SjmsMessage out = exchange.getOut(SjmsMessage.class); + if (ExchangeHelper.getResponse(exchange) instanceof SjmsMessage out) { try { - if (out != null && out.getJmsMessage() != null) { + if (out.getJmsMessage() != null) { out.setMessageId(out.getJmsMessage().getJMSMessageID()); } } catch (JMSException e) { diff --git a/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/reply/ReplyManagerSupport.java b/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/reply/ReplyManagerSupport.java index 1b0b37808c181..90e8c610d9f45 100644 --- a/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/reply/ReplyManagerSupport.java +++ b/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/reply/ReplyManagerSupport.java @@ -169,7 +169,7 @@ public void processReply(ReplyHolder holder) { // the JmsBinding is designed to be "pull-based": it will populate the Camel message on demand // therefore, we link Exchange and OUT message before continuing, so that the JmsBinding has full access // to everything it may need, and can populate headers, properties, etc. accordingly (solves CAMEL-6218). - exchange.setOut(response); + ExchangeHelper.setResponse(exchange, response); Object body = response.getBody(); if (endpoint.isTransferException() && body instanceof Exception exception) { @@ -184,7 +184,7 @@ public void processReply(ReplyHolder holder) { // restore correlation id in case the remote server messed with it if (holder.getOriginalCorrelationId() != null) { JmsMessageHelper.setCorrelationId(message, holder.getOriginalCorrelationId()); - exchange.getOut().setHeader(SjmsConstants.JMS_CORRELATION_ID, holder.getOriginalCorrelationId()); + exchange.getMessage().setHeader(SjmsConstants.JMS_CORRELATION_ID, holder.getOriginalCorrelationId()); } } } finally { diff --git a/components/camel-smooks/src/main/java/org/apache/camel/component/smooks/converter/SinkConverter.java b/components/camel-smooks/src/main/java/org/apache/camel/component/smooks/converter/SinkConverter.java index beb66fbd1fe0d..cedb57be8e1e4 100644 --- a/components/camel-smooks/src/main/java/org/apache/camel/component/smooks/converter/SinkConverter.java +++ b/components/camel-smooks/src/main/java/org/apache/camel/component/smooks/converter/SinkConverter.java @@ -78,7 +78,7 @@ public static String toString(StringSink result) { @SuppressWarnings("rawtypes") public static Map toMap(JavaSink.ResultMap resultBeans, Exchange exchange) { - Message outMessage = exchange.getOut(); + Message outMessage = exchange.getMessage(); outMessage.setBody(resultBeans); @SuppressWarnings("unchecked") diff --git a/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/Soap11DataFormatAdapter.java b/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/Soap11DataFormatAdapter.java index 07d91b6bc2a1d..cb1fca51b98b4 100644 --- a/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/Soap11DataFormatAdapter.java +++ b/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/Soap11DataFormatAdapter.java @@ -161,7 +161,7 @@ public Object doUnmarshal(Exchange exchange, InputStream stream, Object rootObje } else { returnHeaders = anyHeaderElements; } - exchange.getOut().setHeader(SoapDataFormat.SOAP_UNMARSHALLED_HEADER_LIST, returnHeaders); + exchange.getMessage().setHeader(SoapDataFormat.SOAP_UNMARSHALLED_HEADER_LIST, returnHeaders); } } diff --git a/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/Soap12DataFormatAdapter.java b/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/Soap12DataFormatAdapter.java index 9409eb9b4ecdf..cdeb7e6563c66 100644 --- a/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/Soap12DataFormatAdapter.java +++ b/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/Soap12DataFormatAdapter.java @@ -172,7 +172,7 @@ public Object doUnmarshal(Exchange exchange, InputStream stream, Object rootObje } else { returnHeaders = anyHeaderElements; } - exchange.getOut().setHeader(SoapDataFormat.SOAP_UNMARSHALLED_HEADER_LIST, returnHeaders); + exchange.getMessage().setHeader(SoapDataFormat.SOAP_UNMARSHALLED_HEADER_LIST, returnHeaders); } } diff --git a/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/SoapDataFormat.java b/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/SoapDataFormat.java index f48d08e2a8f68..93a01de1d1f47 100644 --- a/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/SoapDataFormat.java +++ b/components/camel-soap/src/main/java/org/apache/camel/dataformat/soap/SoapDataFormat.java @@ -170,7 +170,7 @@ public Object unmarshal(Exchange exchange, Object body) throws Exception { if (soapAction != null && elementNameStrategy instanceof ServiceInterfaceStrategy) { ServiceInterfaceStrategy strategy = (ServiceInterfaceStrategy) elementNameStrategy; String methodName = strategy.getMethodForSoapAction(soapAction); - exchange.getOut().setHeader(SOAP_METHOD_NAME, methodName); + exchange.getMessage().setHeader(SOAP_METHOD_NAME, methodName); } // Store soap action for an eventual later marshal step. diff --git a/components/camel-spring-parent/camel-spring-batch/src/main/java/org/apache/camel/component/spring/batch/SpringBatchProducer.java b/components/camel-spring-parent/camel-spring-batch/src/main/java/org/apache/camel/component/spring/batch/SpringBatchProducer.java index b7a98a73924ef..298317875f1d3 100644 --- a/components/camel-spring-parent/camel-spring-batch/src/main/java/org/apache/camel/component/spring/batch/SpringBatchProducer.java +++ b/components/camel-spring-parent/camel-spring-batch/src/main/java/org/apache/camel/component/spring/batch/SpringBatchProducer.java @@ -76,8 +76,7 @@ public void process(Exchange exchange) throws Exception { } JobExecution jobExecution = jobLauncher.run(job2run, jobParameters); - exchange.getOut().getHeaders().putAll(exchange.getIn().getHeaders()); - exchange.getOut().setBody(jobExecution); + exchange.getMessage().setBody(jobExecution); } /** diff --git a/components/camel-spring-parent/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceProducer.java b/components/camel-spring-parent/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceProducer.java index 112ac48121307..9846afff2d39f 100644 --- a/components/camel-spring-parent/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceProducer.java +++ b/components/camel-spring-parent/camel-spring-ws/src/main/java/org/apache/camel/component/spring/ws/SpringWebserviceProducer.java @@ -37,7 +37,6 @@ import org.apache.camel.RuntimeCamelException; import org.apache.camel.attachment.AttachmentMessage; import org.apache.camel.support.DefaultProducer; -import org.apache.camel.support.ExchangeHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ws.WebServiceMessage; @@ -107,13 +106,8 @@ public void doWithMessage(WebServiceMessage requestMessage) throws IOException, @Override public void doWithMessage(WebServiceMessage responseMessage) throws IOException, TransformerException { SoapMessage soapMessage = (SoapMessage) responseMessage; - if (ExchangeHelper.isOutCapable(exchange)) { - exchange.getOut().copyFromWithNewBody(exchange.getIn(), soapMessage.getPayloadSource()); - populateHeaderAndAttachmentsFromResponse(exchange.getOut(AttachmentMessage.class), soapMessage); - } else { - exchange.getIn().setBody(soapMessage.getPayloadSource()); - populateHeaderAndAttachmentsFromResponse(exchange.getIn(AttachmentMessage.class), soapMessage); - } + exchange.getMessage().setBody(soapMessage.getPayloadSource()); + populateHeaderAndAttachmentsFromResponse(exchange.getMessage(AttachmentMessage.class), soapMessage); } }); diff --git a/components/camel-spring-parent/camel-spring/src/main/java/org/apache/camel/language/spel/RootObject.java b/components/camel-spring-parent/camel-spring/src/main/java/org/apache/camel/language/spel/RootObject.java index 8f6c4ce7296ea..86da62e90036c 100644 --- a/components/camel-spring-parent/camel-spring/src/main/java/org/apache/camel/language/spel/RootObject.java +++ b/components/camel-spring-parent/camel-spring/src/main/java/org/apache/camel/language/spel/RootObject.java @@ -57,6 +57,7 @@ public Message getMessage() { return exchange.getMessage(); } + @SuppressWarnings("deprecation") @Deprecated public Message getResponse() { return exchange.getOut(); diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredProducer.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredProducer.java index ed036d9b84a02..1f9b0c5273d2c 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredProducer.java +++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredProducer.java @@ -80,24 +80,19 @@ public void execute(StatementWrapper ps) throws SQLException, DataAccessExceptio exchange.getIn().setHeader(SqlStoredConstants.SQL_STORED_UPDATE_COUNT, total); } else { Object result = ps.executeStatement(); - // preserve headers first, so we can override the SQL_ROW_COUNT and SQL_UPDATE_COUNT headers - // if statement returns them - exchange.getOut().getHeaders().putAll(exchange.getIn().getHeaders()); if (result != null) { - if (getEndpoint().isNoop()) { - exchange.getOut().setBody(exchange.getIn().getBody()); - } else if (getEndpoint().getOutputHeader() != null) { - exchange.getOut().setBody(exchange.getIn().getBody()); - exchange.getOut().setHeader(getEndpoint().getOutputHeader(), result); - } else { - exchange.getOut().setBody(result); + if (!getEndpoint().isNoop()) { + if (getEndpoint().getOutputHeader() != null) { + exchange.getMessage().setHeader(getEndpoint().getOutputHeader(), result); + } else { + exchange.getMessage().setBody(result); + } } } - // for noop=true we still want to enrich with the headers if (ps.getUpdateCount() != null) { - exchange.getOut().setHeader(SqlStoredConstants.SQL_STORED_UPDATE_COUNT, ps.getUpdateCount()); + exchange.getMessage().setHeader(SqlStoredConstants.SQL_STORED_UPDATE_COUNT, ps.getUpdateCount()); } } } diff --git a/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshProducer.java b/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshProducer.java index 850bb794d2e85..3dd17d1d54d3b 100644 --- a/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshProducer.java +++ b/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshProducer.java @@ -72,13 +72,10 @@ public void process(Exchange exchange) throws Exception { } SshResult result = SshHelper.sendExecCommand(headers, command, endpoint, client); - // propagate headers - exchange.getOut().getHeaders().putAll(in.getHeaders()); - // store result - exchange.getOut().setBody(result.getStdout()); - exchange.getOut().setHeader(SshConstants.EXIT_VALUE, result.getExitValue()); - exchange.getOut().setHeader(SshConstants.STDERR, result.getStderr()); + exchange.getMessage().setBody(result.getStdout()); + exchange.getMessage().setHeader(SshConstants.EXIT_VALUE, result.getExitValue()); + exchange.getMessage().setHeader(SshConstants.STDERR, result.getStderr()); } catch (Exception e) { throw new CamelExchangeException("Cannot execute command: " + command, exchange, e); } diff --git a/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXProcessor.java b/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXProcessor.java index 2fb8e0961a44a..54c2255f1cb2f 100644 --- a/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXProcessor.java +++ b/components/camel-stax/src/main/java/org/apache/camel/component/stax/StAXProcessor.java @@ -24,7 +24,6 @@ import com.ctc.wstx.sr.ValidatingStreamReader; import org.apache.camel.Exchange; import org.apache.camel.Processor; -import org.apache.camel.support.ExchangeHelper; /** * It uses SAX content handler to handle events. @@ -62,12 +61,7 @@ public void process(Exchange exchange) throws Exception { reader.setContentHandler(handler); // InputSource is ignored anyway reader.parse((InputSource) null); - if (ExchangeHelper.isOutCapable(exchange)) { - exchange.getOut().setHeaders(exchange.getIn().getHeaders()); - exchange.getOut().setBody(handler); - } else { - exchange.getIn().setBody(handler); - } + exchange.getMessage().setBody(handler); } finally { if (stream != null) { stream.close(); diff --git a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowClientCallback.java b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowClientCallback.java index 0a7efc25ac7f5..8a6765a71e91d 100644 --- a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowClientCallback.java +++ b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowClientCallback.java @@ -161,7 +161,7 @@ protected void finish(final Message result, boolean close) { if (result != null) { if (ExchangeHelper.isOutCapable(exchange)) { - exchange.setOut(result); + ExchangeHelper.setResponse(exchange, result); } else { exchange.setIn(result); } @@ -222,7 +222,7 @@ void setupResponseListener(final ClientExchange clientExchange) { final Exception cause = new HttpOperationFailedException(uri, code, statusText, null, headers, bodyText); if (ExchangeHelper.isOutCapable(exchange)) { - exchange.setOut(result); + ExchangeHelper.setResponse(exchange, result); } else { exchange.setIn(result); } diff --git a/components/camel-vertx/camel-vertx/src/main/java/org/apache/camel/component/vertx/VertxProducer.java b/components/camel-vertx/camel-vertx/src/main/java/org/apache/camel/component/vertx/VertxProducer.java index ea4eb70124b89..45658643998d3 100644 --- a/components/camel-vertx/camel-vertx/src/main/java/org/apache/camel/component/vertx/VertxProducer.java +++ b/components/camel-vertx/camel-vertx/src/main/java/org/apache/camel/component/vertx/VertxProducer.java @@ -25,7 +25,6 @@ import org.apache.camel.InvalidPayloadRuntimeException; import org.apache.camel.support.DefaultAsyncProducer; import org.apache.camel.support.ExchangeHelper; -import org.apache.camel.support.MessageHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -93,8 +92,6 @@ private CamelReplyHandler(Exchange exchange, AsyncCallback callback) { @Override public void handle(AsyncResult> event) { try { - // preserve headers - MessageHelper.copyHeaders(exchange.getIn(), exchange.getOut(), false); Throwable e = event.cause(); if (e != null) { exchange.setException(e); diff --git a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlSignerProcessor.java b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlSignerProcessor.java index 312789d8f5465..d5d0a8ec42134 100644 --- a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlSignerProcessor.java +++ b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlSignerProcessor.java @@ -196,30 +196,21 @@ public XmlSignerConfiguration getConfiguration() { @Override public void process(Exchange exchange) throws Exception { - try { - LOG.debug("XML signature generation started using algorithm {} and canonicalization method {}", getConfiguration() - .getSignatureAlgorithm(), getConfiguration().getCanonicalizationMethod().getAlgorithm()); - - // lets setup the out message before we invoke the signing - // so that it can mutate it if necessary - Message out = exchange.getOut(); - out.copyFrom(exchange.getIn()); - - Document outputDoc = sign(out); - - ByteArrayOutputStream outStream = new ByteArrayOutputStream(); - XmlSignatureHelper.transformNonTextNodeToOutputStream(outputDoc, outStream, omitXmlDeclaration(out), - getConfiguration().getOutputXmlEncoding()); - byte[] data = outStream.toByteArray(); - out.setBody(data); - setOutputEncodingToMessageHeader(out); - clearMessageHeaders(out); - LOG.debug("XML signature generation finished"); - } catch (Exception e) { - // remove OUT message, as an exception occurred - exchange.setOut(null); - throw e; - } + LOG.debug("XML signature generation started using algorithm {} and canonicalization method {}", getConfiguration() + .getSignatureAlgorithm(), getConfiguration().getCanonicalizationMethod().getAlgorithm()); + + Message out = exchange.getMessage(); + + Document outputDoc = sign(out); + + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + XmlSignatureHelper.transformNonTextNodeToOutputStream(outputDoc, outStream, omitXmlDeclaration(out), + getConfiguration().getOutputXmlEncoding()); + byte[] data = outStream.toByteArray(); + out.setBody(data); + setOutputEncodingToMessageHeader(out); + clearMessageHeaders(out); + LOG.debug("XML signature generation finished"); } protected Document sign(final Message out) throws Exception { diff --git a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlVerifierProcessor.java b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlVerifierProcessor.java index db423537c9d8e..467afb82a94f1 100644 --- a/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlVerifierProcessor.java +++ b/components/camel-xmlsecurity/src/main/java/org/apache/camel/component/xmlsecurity/processor/XmlVerifierProcessor.java @@ -80,16 +80,9 @@ public XmlVerifierConfiguration getConfiguration() { public void process(Exchange exchange) throws Exception { InputStream stream = exchange.getIn().getMandatoryBody(InputStream.class); try { - // lets setup the out message before we invoke the signing - // so that it can mutate it if necessary - Message out = exchange.getOut(); - out.copyFrom(exchange.getIn()); + Message out = exchange.getMessage(); verify(stream, out); clearMessageHeaders(out); - } catch (Exception e) { - // remove OUT message, as an exception occurred - exchange.setOut(null); - throw e; } finally { IOHelper.close(stream, "input stream"); } diff --git a/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/MessageVariableResolver.java b/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/MessageVariableResolver.java index ec43edcffdfd1..0466628d45b93 100644 --- a/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/MessageVariableResolver.java +++ b/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/MessageVariableResolver.java @@ -24,6 +24,7 @@ import org.apache.camel.Exchange; import org.apache.camel.Message; +import org.apache.camel.support.ExchangeHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -85,8 +86,8 @@ public Object resolveVariable(QName name) { answer = in.getBody(); } } else if (uri.equals(OUT_NAMESPACE)) { - if (exchange.get().hasOut()) { - Message out = exchange.get().getOut(); + Message out = ExchangeHelper.getResponse(exchange.get()); + if (out != null) { answer = out.getHeader(localPart); if (answer == null && localPart.equals("body")) { answer = out.getBody(); diff --git a/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathBuilder.java b/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathBuilder.java index 80f9ebfe30d3c..aad00e2006b65 100644 --- a/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathBuilder.java +++ b/components/camel-xpath/src/main/java/org/apache/camel/language/xpath/XPathBuilder.java @@ -53,6 +53,7 @@ import org.apache.camel.CamelContextAware; import org.apache.camel.Exchange; import org.apache.camel.Expression; +import org.apache.camel.Message; import org.apache.camel.NoTypeConversionAvailableException; import org.apache.camel.Predicate; import org.apache.camel.RuntimeCamelException; @@ -669,8 +670,10 @@ public void setHeaderFunction(XPathFunction headerFunction) { * A default function will be assigned (if no custom assigned) when either starting this builder or on first * evaluation. * - * @return the function, or null if this builder has not been started/used before. + * @return the function, or null if this builder has not been started/used before. + * @deprecated use the in: namespace functions instead, as the in/out distinction on Exchange is deprecated */ + @Deprecated public XPathFunction getOutBodyFunction() { return outBodyFunction; } @@ -679,14 +682,19 @@ private XPathFunction createOutBodyFunction() { return new XPathFunction() { @SuppressWarnings("rawtypes") public Object evaluate(List list) throws XPathFunctionException { - if (exchange.get() != null && exchange.get().hasOut()) { - return exchange.get().getOut().getBody(); + if (exchange.get() != null) { + Message response = ExchangeHelper.getResponse(exchange.get()); + return response != null ? response.getBody() : null; } return null; } }; } + /** + * @deprecated the in/out distinction on Exchange is deprecated + */ + @Deprecated public void setOutBodyFunction(XPathFunction outBodyFunction) { this.outBodyFunction = outBodyFunction; } @@ -697,8 +705,10 @@ public void setOutBodyFunction(XPathFunction outBodyFunction) { * A default function will be assigned (if no custom assigned) when either starting this builder or on first * evaluation. * - * @return the function, or null if this builder has not been started/used before. + * @return the function, or null if this builder has not been started/used before. + * @deprecated use the in: namespace functions instead, as the in/out distinction on Exchange is deprecated */ + @Deprecated public XPathFunction getOutHeaderFunction() { return outHeaderFunction; } @@ -708,10 +718,14 @@ private XPathFunction createOutHeaderFunction() { @SuppressWarnings("rawtypes") public Object evaluate(List list) throws XPathFunctionException { if (exchange.get() != null && !list.isEmpty()) { - Object value = list.get(0); - if (value != null) { - String headerText = exchange.get().getContext().getTypeConverter().convertTo(String.class, value); - return exchange.get().getOut().getHeader(headerText); + Message response = ExchangeHelper.getResponse(exchange.get()); + if (response != null) { + Object value = list.get(0); + if (value != null) { + String headerText + = exchange.get().getContext().getTypeConverter().convertTo(String.class, value); + return response.getHeader(headerText); + } } } return null; @@ -719,6 +733,10 @@ public Object evaluate(List list) throws XPathFunctionException { }; } + /** + * @deprecated the in/out distinction on Exchange is deprecated + */ + @Deprecated public void setOutHeaderFunction(XPathFunction outHeaderFunction) { this.outHeaderFunction = outHeaderFunction; } diff --git a/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltBuilder.java b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltBuilder.java index 30fc027fde208..21cdf79c2983c 100644 --- a/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltBuilder.java +++ b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltBuilder.java @@ -108,8 +108,9 @@ public void process(Exchange exchange) throws Exception { ResultHandler resultHandler = resultHandlerFactory.createResult(exchange); Result result = resultHandler.getResult(); - // let's copy the headers before we invoke the transform in case they modify them - Message out = exchange.getOut(); + // copy headers before invoking the transform; getMessage() returns IN here + // (no OUT yet), so copyFrom is a no-op for headers but sets up the message state + Message out = exchange.getMessage(); out.copyFrom(exchange.getIn()); // the underlying input stream, which we need to close to avoid locking files or other resources @@ -489,7 +490,11 @@ protected void configureTransformer(Transformer transformer, Exchange exchange) addParameters(transformer, getParameters()); transformer.setParameter("exchange", exchange); transformer.setParameter("in", exchange.getIn()); - transformer.setParameter("out", exchange.getOut()); + // only set "out" param if a response exists; avoids creating an empty OUT as side effect + Message response = ExchangeHelper.getResponse(exchange); + if (response != null) { + transformer.setParameter("out", response); + } } protected void addParameters(Transformer transformer, Map map) { From 029f64eea172c3688d33048d76355c8d324247c6 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Wed, 8 Apr 2026 19:20:12 +0200 Subject: [PATCH 3/3] CAMEL-22549: Add tests, update existing tests, and document upgrade guide Update tests to use ExchangeHelper methods instead of deprecated getOut/hasOut/setOut. Add new tests for createResponse() and createResponseFromInput() helpers. Document the new ExchangeHelper response methods in the 4.19 upgrade guide. Co-Authored-By: Claude Opus 4.6 --- .../CometdProducerConsumerInOutTest.java | 5 +- .../component/cxf/CxfDispatchMessageTest.java | 8 +- .../component/cxf/CxfDispatchPayloadTest.java | 8 +- .../HL7MLLPNettyDecoderResourceLeakTest.java | 2 +- .../hl7/HL7MLLPNettyRouteToTest.java | 2 +- .../JacksonMarshalContentTypeHeaderTest.java | 4 - .../JacksonMarshalContentTypeHeaderTest.java | 4 - .../JacksonMarshalContentTypeHeaderTest.java | 4 - .../JacksonMarshalContentTypeHeaderTest.java | 4 - .../jcr/JcrAuthLoginFailureTest.java | 6 +- .../mina/MinaTransferExchangeOptionTest.java | 1 + .../MinaVMTransferExchangeOptionTest.java | 1 + .../apache/camel/language/mvel/MvelTest.java | 2 + .../http/NettyHttpProducerSimpleTest.java | 2 - .../NettyTransferExchangeOptionTest.java | 2 + .../apache/camel/language/ognl/OgnlTest.java | 2 + .../component/smooks/SmooksProcessorTest.java | 2 +- .../smooks/SmooksDataFormatTest.java | 7 +- .../filter/impl/BasicMessageFilterTest.java | 30 ++++---- .../SqlProducerUseMessageBodyForSqlTest.java | 3 - ...dertowProducerThrowExceptionErrorTest.java | 2 +- .../seda/SedaWaitForTaskAsPropertyTest.java | 5 +- .../SedaWaitForTaskIfReplyExpectedTest.java | 5 +- .../seda/SedaWaitForTaskNewerTest.java | 5 +- .../issues/SplitStopOnExceptionIssueTest.java | 3 +- .../processor/MulticastRedeliverTest.java | 5 +- .../ProcessorMutateExchangeRedeliverTest.java | 5 +- .../processor/RecipientListRedeliverTest.java | 5 +- .../processor/RoutingSlipRedeliverTest.java | 5 +- .../processor/SimpleSingleOutputMockTest.java | 1 - .../apache/camel/processor/SplitterTest.java | 3 +- .../processor/enricher/EnricherTest.java | 7 +- .../apache/camel/util/ExchangeHelperTest.java | 75 ++++++++++++++++++- .../apache/camel/util/MessageHelperTest.java | 2 +- .../pages/camel-4x-upgrade-guide-4_19.adoc | 17 +++++ 35 files changed, 164 insertions(+), 80 deletions(-) diff --git a/components/camel-cometd/src/test/java/org/apache/camel/component/cometd/CometdProducerConsumerInOutTest.java b/components/camel-cometd/src/test/java/org/apache/camel/component/cometd/CometdProducerConsumerInOutTest.java index 017d74fc6525d..850f625fa55fe 100644 --- a/components/camel-cometd/src/test/java/org/apache/camel/component/cometd/CometdProducerConsumerInOutTest.java +++ b/components/camel-cometd/src/test/java/org/apache/camel/component/cometd/CometdProducerConsumerInOutTest.java @@ -126,7 +126,6 @@ public void setupResources() { } @Override - @SuppressWarnings("deprecation") protected RouteBuilder createRouteBuilder() { return new RouteBuilder() { @Override @@ -140,11 +139,11 @@ public void configure() throws URISyntaxException { from(uri) .setExchangePattern(ExchangePattern.InOut) - .process(exchange -> exchange.getOut().setBody("reply: " + exchange.getIn().getBody())); + .process(exchange -> exchange.getMessage().setBody("reply: " + exchange.getIn().getBody())); from(uriSSL) .setExchangePattern(ExchangePattern.InOut) - .process(exchange -> exchange.getOut().setBody("reply SSL: " + exchange.getIn().getBody())); + .process(exchange -> exchange.getMessage().setBody("reply SSL: " + exchange.getIn().getBody())); } }; } diff --git a/components/camel-cxf/camel-cxf-spring-soap/src/test/java/org/apache/camel/component/cxf/CxfDispatchMessageTest.java b/components/camel-cxf/camel-cxf-spring-soap/src/test/java/org/apache/camel/component/cxf/CxfDispatchMessageTest.java index 32786d1d8fb77..b9e1138abbb03 100644 --- a/components/camel-cxf/camel-cxf-spring-soap/src/test/java/org/apache/camel/component/cxf/CxfDispatchMessageTest.java +++ b/components/camel-cxf/camel-cxf-spring-soap/src/test/java/org/apache/camel/component/cxf/CxfDispatchMessageTest.java @@ -25,13 +25,14 @@ import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.apache.camel.component.cxf.common.message.CxfConstants; +import org.apache.camel.support.ExchangeHelper; import org.junit.jupiter.api.Test; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; /** @@ -63,10 +64,7 @@ public void testDipatchMessageOneway() throws Exception { Exchange exchange = sendJaxWsDispatchMessage(name, true); assertEquals(false, exchange.isFailed(), "The request should be handled sucessfully"); - org.apache.camel.Message response = exchange.getOut(); - assertNotNull(response, "The response message must not be null"); - - assertNull(response.getBody(), "The response body must be null"); + assertFalse(ExchangeHelper.hasResponse(exchange), "The oneway response must not have a response message"); } protected Exchange sendJaxWsDispatchMessage(final String name, final boolean oneway) { diff --git a/components/camel-cxf/camel-cxf-spring-soap/src/test/java/org/apache/camel/component/cxf/CxfDispatchPayloadTest.java b/components/camel-cxf/camel-cxf-spring-soap/src/test/java/org/apache/camel/component/cxf/CxfDispatchPayloadTest.java index 5df5c4ee105a5..ada7b1198e4ad 100644 --- a/components/camel-cxf/camel-cxf-spring-soap/src/test/java/org/apache/camel/component/cxf/CxfDispatchPayloadTest.java +++ b/components/camel-cxf/camel-cxf-spring-soap/src/test/java/org/apache/camel/component/cxf/CxfDispatchPayloadTest.java @@ -28,14 +28,15 @@ import org.apache.camel.component.cxf.common.CxfPayload; import org.apache.camel.component.cxf.common.message.CxfConstants; import org.apache.camel.component.cxf.converter.CxfPayloadConverter; +import org.apache.camel.support.ExchangeHelper; import org.apache.cxf.binding.soap.SoapHeader; import org.junit.jupiter.api.Test; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; /** @@ -67,10 +68,7 @@ public void testDispatchPayloadOneway() throws Exception { Exchange exchange = sendJaxWsDispatchPayload(name, true); assertEquals(false, exchange.isFailed(), "The request should be handled sucessfully"); - org.apache.camel.Message response = exchange.getOut(); - assertNotNull(response, "The response must not be null"); - - assertNull(response.getBody(), "The response must be null"); + assertFalse(ExchangeHelper.hasResponse(exchange), "The oneway response must not have a response message"); } private Exchange sendJaxWsDispatchPayload(final String name, final boolean oneway) { diff --git a/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7MLLPNettyDecoderResourceLeakTest.java b/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7MLLPNettyDecoderResourceLeakTest.java index 63915569eb312..dda1bbbbc2dba 100644 --- a/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7MLLPNettyDecoderResourceLeakTest.java +++ b/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7MLLPNettyDecoderResourceLeakTest.java @@ -50,7 +50,7 @@ public void configure() { .process(new Processor() { public void process(Exchange exchange) throws Exception { Message input = exchange.getIn().getBody(Message.class); - exchange.getOut().setBody(input.generateACK()); + exchange.getMessage().setBody(input.generateACK()); } }).to("mock:result"); } diff --git a/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7MLLPNettyRouteToTest.java b/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7MLLPNettyRouteToTest.java index fda6c948d9cf0..10d256c2bc6eb 100644 --- a/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7MLLPNettyRouteToTest.java +++ b/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7MLLPNettyRouteToTest.java @@ -73,7 +73,7 @@ public void process(Exchange exchange) throws Exception { assertEquals("0101701234", qrd.getWhoSubjectFilter(0).getIDNumber().getValue()); Message response = createHL7AsMessage(); - exchange.getOut().setBody(response); + exchange.getMessage().setBody(response); } }); } diff --git a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalContentTypeHeaderTest.java b/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalContentTypeHeaderTest.java index d02677bcaa81f..4ef26dc4eddbd 100644 --- a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalContentTypeHeaderTest.java +++ b/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/JacksonMarshalContentTypeHeaderTest.java @@ -28,7 +28,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; public class JacksonMarshalContentTypeHeaderTest extends CamelTestSupport { @@ -40,7 +39,6 @@ public void testYes() { Exchange out = template.request("direct:yes", exchange -> exchange.getIn().setBody(in)); assertNotNull(out); - assertTrue(out.hasOut()); assertEquals("application/json", out.getMessage().getHeader(Exchange.CONTENT_TYPE)); } @@ -52,7 +50,6 @@ public void testYes2() { Exchange out = template.request("direct:yes2", exchange -> exchange.getIn().setBody(in)); assertNotNull(out); - assertTrue(out.hasOut()); assertEquals("application/json", out.getMessage().getHeader(Exchange.CONTENT_TYPE)); } @@ -64,7 +61,6 @@ public void testNo() { Exchange out = template.request("direct:no", exchange -> exchange.getIn().setBody(in)); assertNotNull(out); - assertTrue(out.hasOut()); assertNull(out.getMessage().getHeader(Exchange.CONTENT_TYPE)); } diff --git a/components/camel-jackson3/src/test/java/org/apache/camel/component/jackson3/JacksonMarshalContentTypeHeaderTest.java b/components/camel-jackson3/src/test/java/org/apache/camel/component/jackson3/JacksonMarshalContentTypeHeaderTest.java index 9a4a0cc580ae5..b7673b9ad0ed3 100644 --- a/components/camel-jackson3/src/test/java/org/apache/camel/component/jackson3/JacksonMarshalContentTypeHeaderTest.java +++ b/components/camel-jackson3/src/test/java/org/apache/camel/component/jackson3/JacksonMarshalContentTypeHeaderTest.java @@ -28,7 +28,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; public class JacksonMarshalContentTypeHeaderTest extends CamelTestSupport { @@ -40,7 +39,6 @@ public void testYes() { Exchange out = template.request("direct:yes", exchange -> exchange.getIn().setBody(in)); assertNotNull(out); - assertTrue(out.hasOut()); assertEquals("application/json", out.getMessage().getHeader(Exchange.CONTENT_TYPE)); } @@ -52,7 +50,6 @@ public void testYes2() { Exchange out = template.request("direct:yes2", exchange -> exchange.getIn().setBody(in)); assertNotNull(out); - assertTrue(out.hasOut()); assertEquals("application/json", out.getMessage().getHeader(Exchange.CONTENT_TYPE)); } @@ -64,7 +61,6 @@ public void testNo() { Exchange out = template.request("direct:no", exchange -> exchange.getIn().setBody(in)); assertNotNull(out); - assertTrue(out.hasOut()); assertNull(out.getMessage().getHeader(Exchange.CONTENT_TYPE)); } diff --git a/components/camel-jackson3xml/src/test/java/org/apache/camel/component/jackson3xml/JacksonMarshalContentTypeHeaderTest.java b/components/camel-jackson3xml/src/test/java/org/apache/camel/component/jackson3xml/JacksonMarshalContentTypeHeaderTest.java index c5edf596206e3..4db4ce977bd25 100644 --- a/components/camel-jackson3xml/src/test/java/org/apache/camel/component/jackson3xml/JacksonMarshalContentTypeHeaderTest.java +++ b/components/camel-jackson3xml/src/test/java/org/apache/camel/component/jackson3xml/JacksonMarshalContentTypeHeaderTest.java @@ -28,7 +28,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; public class JacksonMarshalContentTypeHeaderTest extends CamelTestSupport { @@ -45,7 +44,6 @@ public void process(Exchange exchange) { }); assertNotNull(out); - assertTrue(out.hasOut()); assertEquals("application/xml", out.getMessage().getHeader(Exchange.CONTENT_TYPE)); } @@ -62,7 +60,6 @@ public void process(Exchange exchange) { }); assertNotNull(out); - assertTrue(out.hasOut()); assertEquals("application/xml", out.getMessage().getHeader(Exchange.CONTENT_TYPE)); } @@ -79,7 +76,6 @@ public void process(Exchange exchange) { }); assertNotNull(out); - assertTrue(out.hasOut()); assertNull(out.getMessage().getHeader(Exchange.CONTENT_TYPE)); } diff --git a/components/camel-jacksonxml/src/test/java/org/apache/camel/component/jacksonxml/JacksonMarshalContentTypeHeaderTest.java b/components/camel-jacksonxml/src/test/java/org/apache/camel/component/jacksonxml/JacksonMarshalContentTypeHeaderTest.java index d0f60af6ecbef..02dc0e8f0d93e 100644 --- a/components/camel-jacksonxml/src/test/java/org/apache/camel/component/jacksonxml/JacksonMarshalContentTypeHeaderTest.java +++ b/components/camel-jacksonxml/src/test/java/org/apache/camel/component/jacksonxml/JacksonMarshalContentTypeHeaderTest.java @@ -28,7 +28,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; public class JacksonMarshalContentTypeHeaderTest extends CamelTestSupport { @@ -45,7 +44,6 @@ public void process(Exchange exchange) { }); assertNotNull(out); - assertTrue(out.hasOut()); assertEquals("application/xml", out.getMessage().getHeader(Exchange.CONTENT_TYPE)); } @@ -62,7 +60,6 @@ public void process(Exchange exchange) { }); assertNotNull(out); - assertTrue(out.hasOut()); assertEquals("application/xml", out.getMessage().getHeader(Exchange.CONTENT_TYPE)); } @@ -79,7 +76,6 @@ public void process(Exchange exchange) { }); assertNotNull(out); - assertTrue(out.hasOut()); assertNull(out.getMessage().getHeader(Exchange.CONTENT_TYPE)); } diff --git a/components/camel-jcr/src/test/java/org/apache/camel/component/jcr/JcrAuthLoginFailureTest.java b/components/camel-jcr/src/test/java/org/apache/camel/component/jcr/JcrAuthLoginFailureTest.java index 4de7c5e9ea905..677b38a094656 100644 --- a/components/camel-jcr/src/test/java/org/apache/camel/component/jcr/JcrAuthLoginFailureTest.java +++ b/components/camel-jcr/src/test/java/org/apache/camel/component/jcr/JcrAuthLoginFailureTest.java @@ -20,10 +20,11 @@ import org.apache.camel.Exchange; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.support.ExchangeHelper; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; public class JcrAuthLoginFailureTest extends JcrAuthTestBase { @@ -33,8 +34,7 @@ public void testCreateNodeWithAuthentication() { Exchange exchange = createExchangeWithBody("hello!"); Exchange out = template.send("direct:a", exchange); assertNotNull(out); - String uuid = out.getOut().getBody(String.class); - assertNull(uuid, "Expected body to be null, found JCR node UUID"); + assertFalse(ExchangeHelper.hasResponse(out), "Should not have a response on login failure"); assertTrue(out.getException() instanceof LoginException, "Wrong exception type"); } diff --git a/components/camel-mina/src/test/java/org/apache/camel/component/mina/MinaTransferExchangeOptionTest.java b/components/camel-mina/src/test/java/org/apache/camel/component/mina/MinaTransferExchangeOptionTest.java index 3be82f8e993f5..8ce1962850cd2 100644 --- a/components/camel-mina/src/test/java/org/apache/camel/component/mina/MinaTransferExchangeOptionTest.java +++ b/components/camel-mina/src/test/java/org/apache/camel/component/mina/MinaTransferExchangeOptionTest.java @@ -95,6 +95,7 @@ private void assertExchange(Exchange exchange, boolean hasException) { assertNull(exchange.getProperty("Charset")); } + @SuppressWarnings("deprecation") // transferExchange=true tests intentionally use getOut() for IN/OUT exchange semantics @Override protected RouteBuilder createRouteBuilder() { return new RouteBuilder() { diff --git a/components/camel-mina/src/test/java/org/apache/camel/component/mina/MinaVMTransferExchangeOptionTest.java b/components/camel-mina/src/test/java/org/apache/camel/component/mina/MinaVMTransferExchangeOptionTest.java index 814d41504a71d..1c485c8b52549 100644 --- a/components/camel-mina/src/test/java/org/apache/camel/component/mina/MinaVMTransferExchangeOptionTest.java +++ b/components/camel-mina/src/test/java/org/apache/camel/component/mina/MinaVMTransferExchangeOptionTest.java @@ -91,6 +91,7 @@ private void assertExchange(Exchange exchange, boolean hasException) { assertNull(exchange.getProperty("Charset")); } + @SuppressWarnings("deprecation") // transferExchange=true tests intentionally use getOut() for IN/OUT exchange semantics @Override protected RouteBuilder createRouteBuilder() { return new RouteBuilder() { diff --git a/components/camel-mvel/src/test/java/org/apache/camel/language/mvel/MvelTest.java b/components/camel-mvel/src/test/java/org/apache/camel/language/mvel/MvelTest.java index 3dae0507e374f..03be3d2b99652 100644 --- a/components/camel-mvel/src/test/java/org/apache/camel/language/mvel/MvelTest.java +++ b/components/camel-mvel/src/test/java/org/apache/camel/language/mvel/MvelTest.java @@ -35,12 +35,14 @@ public void testMvelExpressions() { assertExpression("request.headers.foo", "abc"); } + @SuppressWarnings("deprecation") @Test public void testGetOutFalseKeepsNullOutMessage() { assertExpression("exchange.hasOut()", false); assertFalse(exchange.hasOut()); } + @SuppressWarnings("deprecation") @Test public void testResponseCreatesOutMessage() { assertExpression("response.body", null); diff --git a/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpProducerSimpleTest.java b/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpProducerSimpleTest.java index af9c5a22513cd..0529563406179 100644 --- a/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpProducerSimpleTest.java +++ b/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpProducerSimpleTest.java @@ -24,7 +24,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; public class NettyHttpProducerSimpleTest extends BaseNettyTestSupport { @@ -45,7 +44,6 @@ public void testHttpSimpleExchange() throws Exception { Exchange out = template.request("netty-http:http://localhost:{{port}}/foo", exchange -> exchange.getIn().setBody("Hello World")); assertNotNull(out); - assertTrue(out.hasOut()); NettyHttpMessage response = out.getMessage(NettyHttpMessage.class); assertNotNull(response); diff --git a/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyTransferExchangeOptionTest.java b/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyTransferExchangeOptionTest.java index 11308243eca78..4119c455c8985 100644 --- a/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyTransferExchangeOptionTest.java +++ b/components/camel-netty/src/test/java/org/apache/camel/component/netty/NettyTransferExchangeOptionTest.java @@ -90,6 +90,7 @@ private Exchange sendExchange(boolean setException) throws Exception { return exchange; } + @SuppressWarnings("deprecation") private void assertExchange(Exchange exchange, boolean hasException) { if (!hasException) { Message out = exchange.getOut(); @@ -120,6 +121,7 @@ protected RouteBuilder createRouteBuilder() { public void configure() { from("netty:tcp://localhost:{{port}}?transferExchange=true&encoders=#encoder&decoders=#decoder") .process(new Processor() { + @SuppressWarnings("deprecation") public void process(Exchange e) { assertNotNull(e.getIn().getBody()); assertNotNull(e.getIn().getHeaders()); diff --git a/components/camel-ognl/src/test/java/org/apache/camel/language/ognl/OgnlTest.java b/components/camel-ognl/src/test/java/org/apache/camel/language/ognl/OgnlTest.java index 23fa14f41a1e8..dc9a9385c3492 100644 --- a/components/camel-ognl/src/test/java/org/apache/camel/language/ognl/OgnlTest.java +++ b/components/camel-ognl/src/test/java/org/apache/camel/language/ognl/OgnlTest.java @@ -49,12 +49,14 @@ public void testClassMethodExpression() { assertExpression("@org.apache.camel.language.ognl.Animal1@getClassName()", "Animal"); } + @SuppressWarnings("deprecation") @Test public void testGetOutFalseKeepsNullOutMessage() { assertExpression("exchange.hasOut()", false); assertFalse(exchange.hasOut()); } + @SuppressWarnings("deprecation") @Test public void testResponseCreatesOutMessage() { assertExpression("response.body", null); diff --git a/components/camel-smooks/src/test/java/org/apache/camel/component/smooks/SmooksProcessorTest.java b/components/camel-smooks/src/test/java/org/apache/camel/component/smooks/SmooksProcessorTest.java index ea56368d5fe79..4507e8c57f539 100644 --- a/components/camel-smooks/src/test/java/org/apache/camel/component/smooks/SmooksProcessorTest.java +++ b/components/camel-smooks/src/test/java/org/apache/camel/component/smooks/SmooksProcessorTest.java @@ -425,7 +425,7 @@ public void configure() throws Exception { context.start(); Exchange response = template.request("direct:b", exchange -> exchange.getIn().setBody(new StringSource(""))); - Map javaResult = response.getOut().getBody(Map.class); + Map javaResult = response.getMessage().getBody(Map.class); Integer x = (Integer) javaResult.get("x"); assertEquals(1234, (int) x); Double y = (Double) javaResult.get("y"); diff --git a/components/camel-smooks/src/test/java/org/apache/camel/dataformat/smooks/SmooksDataFormatTest.java b/components/camel-smooks/src/test/java/org/apache/camel/dataformat/smooks/SmooksDataFormatTest.java index 9ff9bd84487e3..4eaf18d8e377c 100644 --- a/components/camel-smooks/src/test/java/org/apache/camel/dataformat/smooks/SmooksDataFormatTest.java +++ b/components/camel-smooks/src/test/java/org/apache/camel/dataformat/smooks/SmooksDataFormatTest.java @@ -76,7 +76,7 @@ public void unmarshal() throws Exception { unmarshalProcessor.process(exchange); - assertEquals(Customer.class, exchange.getOut().getBody().getClass()); + assertEquals(Customer.class, exchange.getMessage().getBody().getClass()); } @Test @@ -96,8 +96,9 @@ public void marshal() throws Exception { marshalProcessor.process(exchange); - assertFalse(DiffBuilder.compare(getCustomerXml(EXPECTED_CUSTOMER_XML)).withTest(exchange.getOut().getBody(String.class)) - .ignoreComments().ignoreWhitespace().build().hasDifferences()); + assertFalse( + DiffBuilder.compare(getCustomerXml(EXPECTED_CUSTOMER_XML)).withTest(exchange.getMessage().getBody(String.class)) + .ignoreComments().ignoreWhitespace().build().hasDifferences()); } @Test diff --git a/components/camel-spring-parent/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/filter/impl/BasicMessageFilterTest.java b/components/camel-spring-parent/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/filter/impl/BasicMessageFilterTest.java index 414b8d39fbaf1..0be3044cdc2e1 100644 --- a/components/camel-spring-parent/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/filter/impl/BasicMessageFilterTest.java +++ b/components/camel-spring-parent/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/filter/impl/BasicMessageFilterTest.java @@ -22,6 +22,7 @@ import org.apache.camel.attachment.AttachmentMessage; import org.apache.camel.component.spring.ws.SpringWebserviceConstants; +import org.apache.camel.support.ExchangeHelper; import org.apache.camel.test.junit6.ExchangeTestSupport; import org.assertj.core.api.Assertions; import org.assertj.core.util.Streams; @@ -68,13 +69,13 @@ public void nonSoapMessageShouldBeSkipped() throws Exception { @Test public void withoutHeader() throws Exception { exchange.getIn().getHeaders().clear(); - exchange.getOut().getHeaders().clear(); + exchange.getMessage().getHeaders().clear(); if (exchange.getIn(AttachmentMessage.class).hasAttachments()) { exchange.getIn(AttachmentMessage.class).getAttachments().clear(); } - if (exchange.getOut(AttachmentMessage.class).hasAttachments()) { - exchange.getOut(AttachmentMessage.class).getAttachments().clear(); + if (exchange.getMessage(AttachmentMessage.class).hasAttachments()) { + exchange.getMessage(AttachmentMessage.class).getAttachments().clear(); } filter.filterProducer(exchange, message); @@ -88,17 +89,20 @@ public void withoutHeader() throws Exception { @Test public void removeCamelInternalHeaderAttributes() throws Exception { - exchange.getOut().getHeaders().put(SpringWebserviceConstants.SPRING_WS_SOAP_ACTION, "mustBeRemoved"); - exchange.getOut().getHeaders().put(SpringWebserviceConstants.SPRING_WS_ADDRESSING_ACTION, "mustBeRemoved"); - exchange.getOut().getHeaders().put(SpringWebserviceConstants.SPRING_WS_ADDRESSING_PRODUCER_FAULT_TO, "mustBeRemoved"); - exchange.getOut().getHeaders().put(SpringWebserviceConstants.SPRING_WS_ADDRESSING_PRODUCER_REPLY_TO, "mustBeRemoved"); - exchange.getOut().getHeaders().put(SpringWebserviceConstants.SPRING_WS_ADDRESSING_CONSUMER_FAULT_ACTION, + ExchangeHelper.createResponse(exchange).getHeaders().put(SpringWebserviceConstants.SPRING_WS_SOAP_ACTION, "mustBeRemoved"); - exchange.getOut().getHeaders().put(SpringWebserviceConstants.SPRING_WS_ADDRESSING_CONSUMER_OUTPUT_ACTION, + exchange.getMessage().getHeaders().put(SpringWebserviceConstants.SPRING_WS_ADDRESSING_ACTION, "mustBeRemoved"); + exchange.getMessage().getHeaders().put(SpringWebserviceConstants.SPRING_WS_ADDRESSING_PRODUCER_FAULT_TO, "mustBeRemoved"); - exchange.getOut().getHeaders().put(SpringWebserviceConstants.SPRING_WS_ENDPOINT_URI, "mustBeRemoved"); + exchange.getMessage().getHeaders().put(SpringWebserviceConstants.SPRING_WS_ADDRESSING_PRODUCER_REPLY_TO, + "mustBeRemoved"); + exchange.getMessage().getHeaders().put(SpringWebserviceConstants.SPRING_WS_ADDRESSING_CONSUMER_FAULT_ACTION, + "mustBeRemoved"); + exchange.getMessage().getHeaders().put(SpringWebserviceConstants.SPRING_WS_ADDRESSING_CONSUMER_OUTPUT_ACTION, + "mustBeRemoved"); + exchange.getMessage().getHeaders().put(SpringWebserviceConstants.SPRING_WS_ENDPOINT_URI, "mustBeRemoved"); - exchange.getOut().getHeaders().put("breadcrumbId", "mustBeRemoved"); + exchange.getMessage().getHeaders().put("breadcrumbId", "mustBeRemoved"); filter.filterConsumer(exchange, message); @@ -110,8 +114,8 @@ public void removeCamelInternalHeaderAttributes() throws Exception { @Test public void consumerWithHeader() throws Exception { - exchange.getOut().getHeaders().put("headerAttributeKey", "testAttributeValue"); - exchange.getOut().getHeaders().put("headerAttributeElement", new QName("http://shouldBeInHeader", "myElement")); + ExchangeHelper.createResponse(exchange).getHeaders().put("headerAttributeKey", "testAttributeValue"); + exchange.getMessage().getHeaders().put("headerAttributeElement", new QName("http://shouldBeInHeader", "myElement")); filter.filterConsumer(exchange, message); Assertions.assertThat(message.getAttachments()).isExhausted(); diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerUseMessageBodyForSqlTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerUseMessageBodyForSqlTest.java index bdaefaa80ff17..4e7c30831eb7f 100644 --- a/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerUseMessageBodyForSqlTest.java +++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerUseMessageBodyForSqlTest.java @@ -31,7 +31,6 @@ import static org.apache.camel.test.junit6.TestSupport.assertIsInstanceOf; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; public class SqlProducerUseMessageBodyForSqlTest extends CamelTestSupport { @@ -145,8 +144,6 @@ public void configure() { String origSql = assertIsInstanceOf(String.class, mock.getReceivedExchanges().get(0).getIn().getBody()); assertEquals("insert into projects(id, project, license) values(:?id,:?project,:?lic)", origSql); - assertNull(mock.getReceivedExchanges().get(0).getOut().getBody()); - // Clear and then use route2 to verify result of above insert select context.removeRoute(context.getRoutes().get(0).getId()); context.addRoutes(new RouteBuilder() { diff --git a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowProducerThrowExceptionErrorTest.java b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowProducerThrowExceptionErrorTest.java index f2e98c99c42f1..ab8caa0479316 100644 --- a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowProducerThrowExceptionErrorTest.java +++ b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowProducerThrowExceptionErrorTest.java @@ -38,7 +38,7 @@ public void testUndertowProducerFail() { Exchange out = fluentTemplate.withHeader("id", "777").to("direct:start").request(Exchange.class); assertNotNull(out); assertFalse(out.isFailed(), "Should not have thrown exception"); - assertEquals(500, out.getOut().getHeader(Exchange.HTTP_RESPONSE_CODE)); + assertEquals(500, out.getMessage().getHeader(Exchange.HTTP_RESPONSE_CODE)); } @Override diff --git a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaWaitForTaskAsPropertyTest.java b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaWaitForTaskAsPropertyTest.java index 91a9905701c6c..d7bb32fe9016a 100644 --- a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaWaitForTaskAsPropertyTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaWaitForTaskAsPropertyTest.java @@ -22,10 +22,11 @@ import org.apache.camel.Processor; import org.apache.camel.WaitForTaskToComplete; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.support.ExchangeHelper; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertFalse; public class SedaWaitForTaskAsPropertyTest extends ContextTestSupport { @@ -59,7 +60,7 @@ public void process(Exchange exchange) { // we do not expecy a reply and thus do no wait so we just get our own // input back assertEquals("Hello World", out.getIn().getBody()); - assertNull(out.getOut().getBody()); + assertFalse(ExchangeHelper.hasResponse(out)); assertMockEndpointsSatisfied(); } diff --git a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaWaitForTaskIfReplyExpectedTest.java b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaWaitForTaskIfReplyExpectedTest.java index 07b02bd5b95f0..def17280e9eb1 100644 --- a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaWaitForTaskIfReplyExpectedTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaWaitForTaskIfReplyExpectedTest.java @@ -21,10 +21,11 @@ import org.apache.camel.ExchangePattern; import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.support.ExchangeHelper; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertFalse; public class SedaWaitForTaskIfReplyExpectedTest extends ContextTestSupport { @@ -51,7 +52,7 @@ public void process(Exchange exchange) { // we do not expecy a reply and thus do no wait so we just get our own // input back assertEquals("Hello World", out.getIn().getBody()); - assertNull(out.getOut().getBody()); + assertFalse(ExchangeHelper.hasResponse(out)); assertMockEndpointsSatisfied(); } diff --git a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaWaitForTaskNewerTest.java b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaWaitForTaskNewerTest.java index 0bd23f2ad9e32..47a4764d511d1 100644 --- a/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaWaitForTaskNewerTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/component/seda/SedaWaitForTaskNewerTest.java @@ -21,10 +21,11 @@ import org.apache.camel.ExchangePattern; import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.support.ExchangeHelper; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertFalse; public class SedaWaitForTaskNewerTest extends ContextTestSupport { @@ -51,7 +52,7 @@ public void process(Exchange exchange) { }); // we do not wait for the response so we just get our own input back assertEquals("Hello World", out.getIn().getBody()); - assertNull(out.getOut().getBody()); + assertFalse(ExchangeHelper.hasResponse(out)); assertMockEndpointsSatisfied(); } diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/SplitStopOnExceptionIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/SplitStopOnExceptionIssueTest.java index 2364edacd43d3..a8176737795de 100644 --- a/core/camel-core/src/test/java/org/apache/camel/issues/SplitStopOnExceptionIssueTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/issues/SplitStopOnExceptionIssueTest.java @@ -20,6 +20,7 @@ import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.support.ExchangeHelper; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; @@ -41,7 +42,7 @@ public void process(Exchange exchange) { }); assertNotNull(out); assertTrue(out.isFailed()); - assertFalse(out.hasOut()); + assertFalse(ExchangeHelper.hasResponse(out)); // when we use stopOnException the exchange should not be affected // during the splitter diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/MulticastRedeliverTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/MulticastRedeliverTest.java index b62afa8fba43f..221e2b53f46c4 100644 --- a/core/camel-core/src/test/java/org/apache/camel/processor/MulticastRedeliverTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/processor/MulticastRedeliverTest.java @@ -21,6 +21,7 @@ import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.support.ExchangeHelper; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -99,7 +100,7 @@ public void configure() { public void process(Exchange exchange) { // should be same input body assertEquals("Hello World", exchange.getIn().getBody()); - assertFalse(exchange.hasOut(), "Should not have OUT"); + assertFalse(ExchangeHelper.hasResponse(exchange), "Should not have OUT"); assertNull(exchange.getException()); counter++; @@ -112,7 +113,7 @@ public void process(Exchange exchange) { public void process(Exchange exchange) { // should be same input body assertEquals("Hello World", exchange.getIn().getBody()); - assertFalse(exchange.hasOut(), "Should not have OUT"); + assertFalse(ExchangeHelper.hasResponse(exchange), "Should not have OUT"); assertNull(exchange.getException()); // mutate OUT body diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/ProcessorMutateExchangeRedeliverTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/ProcessorMutateExchangeRedeliverTest.java index 669ee42210a4a..87cefd19ea74c 100644 --- a/core/camel-core/src/test/java/org/apache/camel/processor/ProcessorMutateExchangeRedeliverTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/processor/ProcessorMutateExchangeRedeliverTest.java @@ -21,6 +21,7 @@ import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.support.ExchangeHelper; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; @@ -79,7 +80,7 @@ public void configure() { public void process(Exchange exchange) { // should be same input body assertEquals("Hello World", exchange.getIn().getBody()); - assertFalse(exchange.hasOut(), "Should not have OUT"); + assertFalse(ExchangeHelper.hasResponse(exchange), "Should not have OUT"); assertNull(exchange.getException()); // mutate IN body @@ -95,7 +96,7 @@ public void process(Exchange exchange) { public void process(Exchange exchange) { // should be same input body assertEquals("Hello World", exchange.getIn().getBody()); - assertFalse(exchange.hasOut(), "Should not have OUT"); + assertFalse(ExchangeHelper.hasResponse(exchange), "Should not have OUT"); assertNull(exchange.getException()); // mutate OUT body diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/RecipientListRedeliverTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/RecipientListRedeliverTest.java index 4b5d4345f8be1..6504671cb6680 100644 --- a/core/camel-core/src/test/java/org/apache/camel/processor/RecipientListRedeliverTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/processor/RecipientListRedeliverTest.java @@ -21,6 +21,7 @@ import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.support.ExchangeHelper; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -95,7 +96,7 @@ public void configure() { public void process(Exchange exchange) { // should be same input body assertEquals("Hello World", exchange.getIn().getBody()); - assertFalse(exchange.hasOut(), "Should not have OUT"); + assertFalse(ExchangeHelper.hasResponse(exchange), "Should not have OUT"); assertNull(exchange.getException()); counter++; @@ -108,7 +109,7 @@ public void process(Exchange exchange) { public void process(Exchange exchange) { // should be same input body assertEquals("Hello World", exchange.getIn().getBody()); - assertFalse(exchange.hasOut(), "Should not have OUT"); + assertFalse(ExchangeHelper.hasResponse(exchange), "Should not have OUT"); assertNull(exchange.getException()); // mutate IN body diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/RoutingSlipRedeliverTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/RoutingSlipRedeliverTest.java index 11e6b75bed26b..fcc0f3320165d 100644 --- a/core/camel-core/src/test/java/org/apache/camel/processor/RoutingSlipRedeliverTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/processor/RoutingSlipRedeliverTest.java @@ -21,6 +21,7 @@ import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.support.ExchangeHelper; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; @@ -98,7 +99,7 @@ public void configure() { public void process(Exchange exchange) { // should be same input body assertEquals("Hello World", exchange.getIn().getBody()); - assertFalse(exchange.hasOut(), "Should not have OUT"); + assertFalse(ExchangeHelper.hasResponse(exchange), "Should not have OUT"); assertNull(exchange.getException()); counter++; @@ -111,7 +112,7 @@ public void process(Exchange exchange) { public void process(Exchange exchange) { // should be same input body assertEquals("Hello World", exchange.getIn().getBody()); - assertFalse(exchange.hasOut(), "Should not have OUT"); + assertFalse(ExchangeHelper.hasResponse(exchange), "Should not have OUT"); assertNull(exchange.getException()); // mutate IN body diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/SimpleSingleOutputMockTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/SimpleSingleOutputMockTest.java index d5a74aaa9a6d1..f7680ac1a232b 100644 --- a/core/camel-core/src/test/java/org/apache/camel/processor/SimpleSingleOutputMockTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/processor/SimpleSingleOutputMockTest.java @@ -35,7 +35,6 @@ public void testSimple() throws Exception { Exchange out = template.request("direct:start", e -> e.getMessage().setBody("Hello World")); assertNotNull(out); assertEquals(ExchangePattern.InOut, out.getPattern()); - assertTrue(out.hasOut()); assertMockEndpointsSatisfied(); } diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/SplitterTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/SplitterTest.java index 9963b3c87df36..4c15aae869ed7 100644 --- a/core/camel-core/src/test/java/org/apache/camel/processor/SplitterTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/processor/SplitterTest.java @@ -33,6 +33,7 @@ import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.processor.aggregate.UseLatestAggregationStrategy; +import org.apache.camel.support.ExchangeHelper; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; @@ -101,7 +102,7 @@ public void process(Exchange exchange) { } }); - assertFalse(result.hasOut(), "Should not have out"); + assertFalse(ExchangeHelper.hasResponse(result), "Should not have out"); } @Test diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherTest.java index 14cbed24241be..0a929f26917e2 100644 --- a/core/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/processor/enricher/EnricherTest.java @@ -22,6 +22,7 @@ import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.support.ExchangeHelper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -63,7 +64,7 @@ public void process(Exchange exchange) { mock.assertIsSatisfied(); assertEquals("test", exchange.getIn().getBody()); assertEquals("failed", exchange.getException().getMessage()); - assertFalse(exchange.hasOut()); + assertFalse(ExchangeHelper.hasResponse(exchange)); } // ------------------------------------------------------------- @@ -86,7 +87,7 @@ public void process(Exchange exchange) { }); assertEquals("bar", exchange.getIn().getHeader("foo")); assertEquals("test:blah", exchange.getIn().getBody()); - assertTrue(exchange.hasOut()); + assertTrue(ExchangeHelper.hasResponse(exchange)); assertNull(exchange.getException()); } @@ -99,7 +100,7 @@ public void process(Exchange exchange) { }); assertEquals("test", exchange.getIn().getBody()); assertEquals("failed", exchange.getException().getMessage()); - assertFalse(exchange.hasOut()); + assertFalse(ExchangeHelper.hasResponse(exchange)); } @Override diff --git a/core/camel-core/src/test/java/org/apache/camel/util/ExchangeHelperTest.java b/core/camel-core/src/test/java/org/apache/camel/util/ExchangeHelperTest.java index 564049ac92496..92c7973a3943c 100644 --- a/core/camel-core/src/test/java/org/apache/camel/util/ExchangeHelperTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/util/ExchangeHelperTest.java @@ -23,6 +23,7 @@ import org.apache.camel.ContextTestSupport; import org.apache.camel.Exchange; import org.apache.camel.ExchangePattern; +import org.apache.camel.Message; import org.apache.camel.NoSuchBeanException; import org.apache.camel.NoSuchHeaderException; import org.apache.camel.NoSuchPropertyException; @@ -191,7 +192,7 @@ public void testCreateVariableMapNoExistingOut() { exchange.setPattern(ExchangePattern.InOut); exchange.getIn().setBody("bar"); exchange.getIn().setHeader("quote", "Camel rocks"); - assertFalse(exchange.hasOut()); + assertFalse(ExchangeHelper.hasResponse(exchange)); Map map = ExchangeHelper.createVariableMap(exchange, true); @@ -210,7 +211,7 @@ public void testCreateVariableMapNoExistingOut() { // but the Exchange does still not have an OUT message to avoid // causing side effects with the createVariableMap method - assertFalse(exchange.hasOut()); + assertFalse(ExchangeHelper.hasResponse(exchange)); } @Test @@ -249,6 +250,76 @@ public void testGetBodyAndResetStreamCache() { assertNull(third); } + @Test + public void testHasResponseNoOut() { + assertFalse(ExchangeHelper.hasResponse(exchange)); + } + + @SuppressWarnings("deprecation") + @Test + public void testHasResponseWithOut() { + exchange.setOut(exchange.getIn().copy()); + assertTrue(ExchangeHelper.hasResponse(exchange)); + } + + @Test + public void testGetResponseNoOut() { + assertNull(ExchangeHelper.getResponse(exchange)); + } + + @SuppressWarnings("deprecation") + @Test + public void testGetResponseWithOut() { + exchange.setOut(exchange.getIn().copy()); + assertNotNull(ExchangeHelper.getResponse(exchange)); + assertSame(exchange.getMessage(), ExchangeHelper.getResponse(exchange)); + } + + @Test + public void testSetResponseCreatesOut() { + assertFalse(ExchangeHelper.hasResponse(exchange)); + ExchangeHelper.setResponse(exchange, exchange.getIn().copy()); + assertTrue(ExchangeHelper.hasResponse(exchange)); + } + + @Test + public void testSetResponseNullClearsOut() { + ExchangeHelper.setResponse(exchange, exchange.getIn().copy()); + assertTrue(ExchangeHelper.hasResponse(exchange)); + ExchangeHelper.setResponse(exchange, null); + assertFalse(ExchangeHelper.hasResponse(exchange)); + } + + @Test + public void testGetResponseDoesNotCreateOut() { + // unlike getOut(), getResponse() must NOT lazily create a message + assertNull(ExchangeHelper.getResponse(exchange)); + assertFalse(ExchangeHelper.hasResponse(exchange)); + } + + @Test + public void testCreateResponse() { + assertFalse(ExchangeHelper.hasResponse(exchange)); + Message response = ExchangeHelper.createResponse(exchange); + assertNotNull(response); + assertTrue(ExchangeHelper.hasResponse(exchange)); + assertSame(response, exchange.getMessage()); + assertNull(response.getBody()); + } + + @Test + public void testCreateResponseFromInput() { + exchange.getIn().setBody("hello"); + exchange.getIn().setHeader("myHeader", "myValue"); + assertFalse(ExchangeHelper.hasResponse(exchange)); + Message response = ExchangeHelper.createResponseFromInput(exchange); + assertNotNull(response); + assertTrue(ExchangeHelper.hasResponse(exchange)); + assertSame(response, exchange.getMessage()); + assertEquals("hello", response.getBody()); + assertEquals("myValue", response.getHeader("myHeader")); + } + @Override @BeforeEach public void setUp() throws Exception { diff --git a/core/camel-core/src/test/java/org/apache/camel/util/MessageHelperTest.java b/core/camel-core/src/test/java/org/apache/camel/util/MessageHelperTest.java index 2f047a915594b..76c7597a068e0 100644 --- a/core/camel-core/src/test/java/org/apache/camel/util/MessageHelperTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/util/MessageHelperTest.java @@ -139,7 +139,7 @@ public void testCopyHeadersWithHeaderFilterStrategy() { message = new DefaultExchange(context).getIn(); Message source = message; - Message target = message.getExchange().getOut(); + Message target = new DefaultMessage(context); DefaultHeaderFilterStrategy headerFilterStrategy = new DefaultHeaderFilterStrategy(); headerFilterStrategy.setInFilterPattern("foo"); diff --git a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_19.adoc b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_19.adoc index 2e505a6ecd73e..da6a2c73234b4 100644 --- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_19.adoc +++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_19.adoc @@ -40,6 +40,23 @@ is backward-compatible with peers that do not support PQC. See xref:camel-configuration-utilities.adoc[JSSE Utility] for full details on PQC TLS configuration. +==== Exchange getOut/hasOut/setOut deprecation migration + +The deprecated `Exchange.getOut()`, `hasOut()`, and `setOut()` methods have been replaced throughout +the codebase with `Exchange.getMessage()` and five new utility methods in `ExchangeHelper`: + +- `ExchangeHelper.hasResponse(exchange)` -- checks if a response (OUT) message exists, without side effects. +- `ExchangeHelper.getResponse(exchange)` -- returns the response message, or `null` if none exists. + Unlike `getOut()`, this does *not* lazily create an empty message. +- `ExchangeHelper.setResponse(exchange, message)` -- explicitly sets or clears the response message. +- `ExchangeHelper.createResponse(exchange)` -- creates a new empty response message and returns it. + This is the non-deprecated equivalent of the lazy-creation side effect of `getOut()`. +- `ExchangeHelper.createResponseFromInput(exchange)` -- creates a response by copying the input message + (headers, body, attachments) and returns it. Use this when the response should inherit the input message's headers. + +Component developers who currently use `getOut()`, `hasOut()`, or `setOut()` should migrate to these utilities. +A follow-up change will add these methods directly to the `Exchange` interface. + The WireTap EIP has removed the `pattern` option from its model (not in use) as wiretap always uses `InOnly` pattern.