This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch send in repository https://gitbox.apache.org/repos/asf/camel.git
commit 661c0d19d2c709b685c754e3056ac55134988b98 Author: Claus Ibsen <[email protected]> AuthorDate: Thu Sep 5 12:13:49 2024 +0200 CAMEL-21136: Add /q/send to camel-main/camel-jbang for sending messages to Camel via HTTP --- .../platform/http/main/MainHttpServer.java | 62 +++++++++++++++------- 1 file changed, 43 insertions(+), 19 deletions(-) diff --git a/components/camel-platform-http-main/src/main/java/org/apache/camel/component/platform/http/main/MainHttpServer.java b/components/camel-platform-http-main/src/main/java/org/apache/camel/component/platform/http/main/MainHttpServer.java index f4eabb1f19d..e6eb2ba7ab6 100644 --- a/components/camel-platform-http-main/src/main/java/org/apache/camel/component/platform/http/main/MainHttpServer.java +++ b/components/camel-platform-http-main/src/main/java/org/apache/camel/component/platform/http/main/MainHttpServer.java @@ -52,7 +52,6 @@ import org.apache.camel.Endpoint; import org.apache.camel.Exchange; import org.apache.camel.ExchangePattern; import org.apache.camel.NoSuchEndpointException; -import org.apache.camel.Processor; import org.apache.camel.ProducerTemplate; import org.apache.camel.StartupListener; import org.apache.camel.StaticService; @@ -1235,22 +1234,20 @@ public class MainHttpServer extends ServiceSupport implements CamelContextAware, String endpoint = ctx.request().getHeader("endpoint"); String exchangePattern = ctx.request().getHeader("exchangePattern"); - if (exchangePattern == null) { - exchangePattern = "InOnly"; // use in-only by default - } + String resultType = ctx.request().getHeader("resultType"); final Map<String, Object> headers = new LinkedHashMap<>(); for (var entry : ctx.request().headers()) { String k = entry.getKey(); - String v = entry.getValue(); - boolean exclude = "endpoint".equals(k) || "exchangePattern".equals(k) || "Accept".equals(k) - || filter.applyFilterToExternalHeaders(entry.getKey(), entry.getValue(), null); + boolean exclude + = "endpoint".equals(k) || "exchangePattern".equals(k) || "resultType".equals(k) || "Accept".equals(k) + || filter.applyFilterToExternalHeaders(entry.getKey(), entry.getValue(), null); if (!exclude) { headers.put(entry.getKey(), entry.getValue()); } } final String body = ctx.body().asString(); - Exchange out; + Exchange out = null; Endpoint target = null; if (endpoint == null) { List<org.apache.camel.Route> routes = camelContext.getRoutes(); @@ -1291,18 +1288,40 @@ public class MainHttpServer extends ServiceSupport implements CamelContextAware, JsonObject jo = new JsonObject(); if (target != null) { - final ExchangePattern mep = ExchangePattern.valueOf(exchangePattern); - out = producer.send(target, new Processor() { - @Override - public void process(Exchange exchange) throws Exception { + Class<?> clazz = null; + try { + if (resultType != null) { + clazz = camelContext.getClassResolver().resolveMandatoryClass(resultType); + // we want the result as a specific type then make sure to use InOut + if (exchangePattern == null) { + exchangePattern = "InOut"; + } + } + if (exchangePattern == null) { + exchangePattern = "InOnly"; // use in-only by default + } + final ExchangePattern mep = ExchangePattern.valueOf(exchangePattern); + out = producer.send(target, exchange -> { exchange.setPattern(mep); exchange.getMessage().setBody(body); if (!headers.isEmpty()) { exchange.getMessage().setHeaders(headers); } + }); + if (clazz != null) { + Object b = out.getMessage().getBody(clazz); + out.getMessage().setBody(b); } - }); - if (out.getException() != null) { + } catch (ClassNotFoundException e) { + jo.put("endpoint", target.getEndpointUri()); + jo.put("exchangePattern", exchangePattern); + jo.put("timestamp", timestamp); + jo.put("elapsed", watch.taken()); + jo.put("status", "failed"); + jo.put("exception", + MessageHelper.dumpExceptionAsJSonObject(e.getException()).getMap("exception")); + } + if (out != null && out.getException() != null) { jo.put("endpoint", target.getEndpointUri()); jo.put("exchangeId", out.getExchangeId()); jo.put("exchangePattern", exchangePattern); @@ -1312,17 +1331,22 @@ public class MainHttpServer extends ServiceSupport implements CamelContextAware, // avoid double wrap jo.put("exception", MessageHelper.dumpExceptionAsJSonObject(out.getException()).getMap("exception")); - } else if ("InOut".equals(exchangePattern)) { + } else if (out != null && "InOut".equals(exchangePattern)) { jo.put("endpoint", target.getEndpointUri()); jo.put("exchangeId", out.getExchangeId()); jo.put("exchangePattern", exchangePattern); jo.put("timestamp", timestamp); jo.put("elapsed", watch.taken()); jo.put("status", "success"); - // avoid double wrap - jo.put("message", MessageHelper.dumpAsJSonObject(out.getMessage(), false, false, true, true, true, true, - BODY_MAX_CHARS).getMap("message")); - } else { + // dump response and remove unwanted data + JsonObject msg = MessageHelper.dumpAsJSonObject(out.getMessage(), false, false, true, true, true, true, + BODY_MAX_CHARS).getMap("message"); + msg.remove("exchangeId"); + msg.remove("exchangePattern"); + msg.remove("exchangeType"); + msg.remove("messageType"); + jo.put("message", msg); + } else if (out != null) { jo.put("endpoint", target.getEndpointUri()); jo.put("exchangeId", out.getExchangeId()); jo.put("exchangePattern", exchangePattern);
