Claus Ibsen created CAMEL-26105:
-----------------------------------
Summary: camel-aws2-athena - take the SQL from the body only with
useMessageBodyForSql
Key: CAMEL-26105
URL: https://issues.apache.org/jira/browse/CAMEL-26105
Project: Camel
Issue Type: Bug
Components: camel-aws2
Reporter: Claus Ibsen
Fix For: 4.24.0, 4.22.3, 4.18.6
h3. Behaviour today
The {{startQueryExecution}} operation (the default operation of the aws2-athena
producer) takes the SQL from the message body first, then from the
{{CamelAwsAthenaQueryString}} header, and from the {{queryString}} endpoint
option only when both are empty ({{Athena2Producer.determineQueryString}}).
So an endpoint that is configured with {{queryString}} does not run that query
whenever the message has a body: it runs the text of the body instead. Examples
are the {{GetQueryExecutionResponse}} that an earlier {{startQueryExecution}}
with {{waitTimeout}} leaves as the body, or a {{Map}} body, whose
{{toString()}} is sent as the query. The documentation does not state this
order, and the option description says to prefer setting the SQL as the body.
In addition, with {{includeTrace=true}} the SQL comment contains the URI of the
from endpoint as is, without the masking Camel applies to endpoint URIs
elsewhere, and it fails with a {{NullPointerException}} when the exchange has
no from endpoint (for example an exchange built by hand).
h3. Behaviour after the change
* A new producer option {{useMessageBodyForSql}} (boolean, default {{false}}),
in line with the option of the same name in camel-sql.
* When it is {{false}}, the SQL comes from the {{CamelAwsAthenaQueryString}}
header, else from the {{queryString}} option. The message body is not used.
When neither is set, the error names the {{queryString}} option, the header and
{{useMessageBodyForSql}}, so a route that relied on the body fails with a clear
message.
* When it is {{true}}, the order stays as today: body, then header, then option.
* With {{includeTrace=true}}, the from endpoint URI is written with
{{URISupport.sanitizeUri}}, and it is left out when the exchange has no from
endpoint.
h3. Code changes
* {{Athena2Configuration}}: add {{useMessageBodyForSql}} ({{@UriParam(label =
"producer", defaultValue = "false")}}) with getter and setter; reword the
{{queryString}} description (header overrides the option; the body is used only
with {{useMessageBodyForSql}}).
* {{Athena2Producer.determineQueryString}}: read the body only when
{{isUseMessageBodyForSql()}} is true; clearer error message; sanitized trace
comment and a null check on the from endpoint.
* {{Athena2Constants}}: reword the description of {{QUERY_STRING}}.
* {{aws2-athena-component.adoc}}: the examples that set the SQL with
{{setBody}} (Java, XML and YAML) also set {{useMessageBodyForSql=true}}, plus a
short section on where the SQL comes from.
* Regenerated files: component JSON, configurers,
{{Athena2EndpointUriFactory}}, endpoint DSL and component DSL, catalog JSON and
doc.
* Upgrade guide 4.24: routes that put the SQL in the message body must set
{{useMessageBodyForSql=true}}. Upgrade guide sections 4.22.3 and 4.18.6: a
route that sets {{queryString}} or the {{CamelAwsAthenaQueryString}} header and
also has a message body now runs that query, not the body.
h3. Tests
* {{AmazonAthenaClientMock}} keeps the last {{StartQueryExecutionRequest}}.
* New {{Athena2ProducerQueryStringTest}}: the {{queryString}} option is used
when the body is set; the header overrides the option; no query fails with a
message naming {{useMessageBodyForSql}}; the body is used when
{{useMessageBodyForSql}} is enabled; with the option enabled and an empty body
the header is used; the response of an earlier step is not sent as the query;
the trace comment holds the sanitized from endpoint URI; the trace comment
works without a from endpoint.
* {{AthenaComponentTest}} and {{AthenaComponentManualIT}} send the SQL in the
body, so their endpoints set {{useMessageBodyForSql=true}}.
* {{AthenaComponentConfigurationTest}} covers the new option.
h3. Backports
Backport to 4.22.x and 4.18.x without the new option:
* the {{CamelAwsAthenaQueryString}} header, then the {{queryString}} option,
then the body;
* routes that put the SQL in the message body keep working;
* the change of the trace comment goes along.
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)