This is an automated email from the ASF dual-hosted git repository.

oscerd pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 3445c57e147d CAMEL-23716: camel-salesforce - align Exchange header 
constant names with Camel naming convention (#23887)
3445c57e147d is described below

commit 3445c57e147da12ccfdde066c06ec5492d8c262b
Author: Andrea Cosentino <[email protected]>
AuthorDate: Tue Jun 9 15:20:00 2026 +0200

    CAMEL-23716: camel-salesforce - align Exchange header constant names with 
Camel naming convention (#23887)
    
    Renames the producer-read Exchange header string values in
    SalesforceEndpointConfig (sObjectQuery, sObjectName, sObjectId, 
sObjectSearch,
    apexUrl, apexMethod, the apexQueryParam. prefix, and the Bulk / Analytics / 
RAW
    / event parameters) to the CamelSalesforce<Name> convention, following the
    pattern established in CAMEL-23576 (camel-jira), CAMEL-23578 (camel-web3j),
    CAMEL-23597 (camel-solr) and the other CAMEL-23577 sub-tasks. This brings 
the
    constants under the default HeaderFilterStrategy (which only filters
    Camel/camel-prefixed headers).
    
    The Java field names are unchanged, so routes that reference the constants
    symbolically continue to compile and run. The endpoint option spelling (for
    example salesforce:query?sObjectQuery=...) is also unchanged, because it is
    bound to the @UriParam field name rather than to these constants. Only the
    header name changes, so routes that set these values as literal-string 
message
    headers must be updated (documented in the 4.21 upgrade guide as a potential
    breaking change).
    
    39 header-readable constants are renamed. The configuration-only options 
that
    are never read from a message header (apiVersion, format, rawPayload,
    defaultReplayId, fallBackReplayId, initialReplayIdMap, replayPreset,
    pubSubDeserializeType, pubSubPojoClass, notFoundBehaviour and
    fallbackToLatestReplayId) are left unchanged, as is the Approval API
    approval / approval.<property> mechanism whose endpoint-option and header
    spellings are intentionally identical and bound to the approval parameter 
name.
    
    Updates the affected tests and the salesforce component documentation, and 
adds
    the 4.21 upgrade-guide entry.
    
    Tracker: CAMEL-23577
    
    Reported by Claude Code on behalf of Andrea Cosentino
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
---
 .../src/main/docs/salesforce-component.adoc        | 20 +++++
 .../salesforce/SalesforceEndpointConfig.java       | 78 +++++++++----------
 .../salesforce/BulkApiV2IngestJobManualIT.java     | 18 ++---
 .../salesforce/BulkApiV2QueryJobManualIT.java      | 20 ++---
 .../salesforce/CompositeApiBatchManualIT.java      |  2 +-
 .../CompositeApiCollectionsManualIT.java           | 14 ++--
 .../component/salesforce/CompositeApiManualIT.java |  2 +-
 .../camel/component/salesforce/RawPayloadTest.java |  4 +-
 .../component/salesforce/RestApiManualIT.java      | 33 ++++----
 .../ROOT/pages/camel-4x-upgrade-guide-4_21.adoc    | 89 ++++++++++++++++++++++
 10 files changed, 198 insertions(+), 82 deletions(-)

diff --git 
a/components/camel-salesforce/camel-salesforce-component/src/main/docs/salesforce-component.adoc
 
b/components/camel-salesforce/camel-salesforce-component/src/main/docs/salesforce-component.adoc
index 91b04d1fc639..7907f3c83f3c 100644
--- 
a/components/camel-salesforce/camel-salesforce-component/src/main/docs/salesforce-component.adoc
+++ 
b/components/camel-salesforce/camel-salesforce-component/src/main/docs/salesforce-component.adoc
@@ -129,6 +129,26 @@ The request message body should be an SObject DTO 
generated using the maven plug
 ...to("salesforce:upsertSObject?sObjectIdName=Name")...
 ----
 
+==== Supplying operation parameters as message headers
+
+The operation parameters described in the per-operation tables below (such as 
`sObjectQuery`,
+`sObjectName`, `sObjectId`, `sObjectSearch`, `apexUrl`, `apexMethod`, the 
`apexQueryParam.` prefix and
+the Bulk/Analytics/RAW parameters) can be supplied either as endpoint options 
or as message headers.
+
+[IMPORTANT]
+====
+Starting with Camel 4.21, when these parameters are supplied as *message 
headers*, the header names
+follow the standard `CamelSalesforce` naming convention so that they are 
governed by the default
+`HeaderFilterStrategy` (which only filters `Camel`/`camel`-prefixed headers). 
For example, set the
+`CamelSalesforceSObjectQuery` header instead of `sObjectQuery`, 
`CamelSalesforceApexUrl` instead of
+`apexUrl`, and use the `CamelSalesforceApexQueryParam.` prefix instead of 
`apexQueryParam.`. The
+*endpoint option* spelling is unchanged (for example 
`salesforce:query?sObjectQuery=...` still works).
+
+Prefer referencing the constants in `SalesforceEndpointConfig` (for example
+`SalesforceEndpointConfig.SOBJECT_QUERY`) when setting these headers, so route 
code is unaffected by
+the value change. See the Camel 4.21 upgrade guide for the full list of 
renamed header names.
+====
+
 === Passing in Salesforce headers and fetching Salesforce response headers
 
 There is support to pass 
https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/headers.htm[Salesforce
 headers]
diff --git 
a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceEndpointConfig.java
 
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceEndpointConfig.java
index e931392757c6..6b8f3f4d0778 100644
--- 
a/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceEndpointConfig.java
+++ 
b/components/camel-salesforce/camel-salesforce-component/src/main/java/org/apache/camel/component/salesforce/SalesforceEndpointConfig.java
@@ -52,47 +52,47 @@ public class SalesforceEndpointConfig implements Cloneable {
     public static final String FORMAT = "format";
     public static final String RAW_PAYLOAD = "rawPayload";
 
-    public static final String SOBJECT_NAME = "sObjectName";
-    public static final String SOBJECT_ID = "sObjectId";
-    public static final String SOBJECT_IDS = "sObjectIds";
-    public static final String SOBJECT_FIELDS = "sObjectFields";
-    public static final String SOBJECT_EXT_ID_NAME = "sObjectIdName";
-    public static final String SOBJECT_EXT_ID_VALUE = "sObjectIdValue";
-    public static final String SOBJECT_BLOB_FIELD_NAME = 
"sObjectBlobFieldName";
-    public static final String SOBJECT_CLASS = "sObjectClass";
-    public static final String SOBJECT_QUERY = "sObjectQuery";
-    public static final String STREAM_QUERY_RESULT = "streamQueryResult";
-    public static final String SOBJECT_SEARCH = "sObjectSearch";
-    public static final String APEX_METHOD = "apexMethod";
-    public static final String APEX_URL = "apexUrl";
-    public static final String COMPOSITE_METHOD = "compositeMethod";
-    public static final String LIMIT = "limit";
-    public static final String ALL_OR_NONE = "allOrNone";
-    public static final String EVENT_NAME = "eventName";
-    public static final String EVENT_SCHEMA_ID = "eventSchemaId";
-    public static final String EVENT_SCHEMA_FORMAT = "eventSchemaFormat";
+    public static final String SOBJECT_NAME = "CamelSalesforceSObjectName";
+    public static final String SOBJECT_ID = "CamelSalesforceSObjectId";
+    public static final String SOBJECT_IDS = "CamelSalesforceSObjectIds";
+    public static final String SOBJECT_FIELDS = "CamelSalesforceSObjectFields";
+    public static final String SOBJECT_EXT_ID_NAME = 
"CamelSalesforceSObjectIdName";
+    public static final String SOBJECT_EXT_ID_VALUE = 
"CamelSalesforceSObjectIdValue";
+    public static final String SOBJECT_BLOB_FIELD_NAME = 
"CamelSalesforceSObjectBlobFieldName";
+    public static final String SOBJECT_CLASS = "CamelSalesforceSObjectClass";
+    public static final String SOBJECT_QUERY = "CamelSalesforceSObjectQuery";
+    public static final String STREAM_QUERY_RESULT = 
"CamelSalesforceStreamQueryResult";
+    public static final String SOBJECT_SEARCH = "CamelSalesforceSObjectSearch";
+    public static final String APEX_METHOD = "CamelSalesforceApexMethod";
+    public static final String APEX_URL = "CamelSalesforceApexUrl";
+    public static final String COMPOSITE_METHOD = 
"CamelSalesforceCompositeMethod";
+    public static final String LIMIT = "CamelSalesforceLimit";
+    public static final String ALL_OR_NONE = "CamelSalesforceAllOrNone";
+    public static final String EVENT_NAME = "CamelSalesforceEventName";
+    public static final String EVENT_SCHEMA_ID = 
"CamelSalesforceEventSchemaId";
+    public static final String EVENT_SCHEMA_FORMAT = 
"CamelSalesforceEventSchemaFormat";
 
     // prefix for parameters in headers
-    public static final String APEX_QUERY_PARAM_PREFIX = "apexQueryParam.";
+    public static final String APEX_QUERY_PARAM_PREFIX = 
"CamelSalesforceApexQueryParam.";
 
     // parameters for Bulk API
-    public static final String CONTENT_TYPE = "contentType";
-    public static final String JOB_ID = "jobId";
-    public static final String BATCH_ID = "batchId";
-    public static final String RESULT_ID = "resultId";
-    public static final String QUERY_LOCATOR = "queryLocator";
-    public static final String LOCATOR = "locator";
-    public static final String MAX_RECORDS = "maxRecords";
-    public static final String PK_CHUNKING = "pkChunking";
-    public static final String PK_CHUNKING_CHUNK_SIZE = "pkChunkingChunkSize";
-    public static final String PK_CHUNKING_PARENT = "pkChunkingParent";
-    public static final String PK_CHUNKING_START_ROW = "pkChunkingStartRow";
+    public static final String CONTENT_TYPE = "CamelSalesforceContentType";
+    public static final String JOB_ID = "CamelSalesforceJobId";
+    public static final String BATCH_ID = "CamelSalesforceBatchId";
+    public static final String RESULT_ID = "CamelSalesforceResultId";
+    public static final String QUERY_LOCATOR = "CamelSalesforceQueryLocator";
+    public static final String LOCATOR = "CamelSalesforceLocator";
+    public static final String MAX_RECORDS = "CamelSalesforceMaxRecords";
+    public static final String PK_CHUNKING = "CamelSalesforcePkChunking";
+    public static final String PK_CHUNKING_CHUNK_SIZE = 
"CamelSalesforcePkChunkingChunkSize";
+    public static final String PK_CHUNKING_PARENT = 
"CamelSalesforcePkChunkingParent";
+    public static final String PK_CHUNKING_START_ROW = 
"CamelSalesforcePkChunkingStartRow";
 
     // parameters for Analytics API
-    public static final String REPORT_ID = "reportId";
-    public static final String INCLUDE_DETAILS = "includeDetails";
-    public static final String REPORT_METADATA = "reportMetadata";
-    public static final String INSTANCE_ID = "instanceId";
+    public static final String REPORT_ID = "CamelSalesforceReportId";
+    public static final String INCLUDE_DETAILS = 
"CamelSalesforceIncludeDetails";
+    public static final String REPORT_METADATA = 
"CamelSalesforceReportMetadata";
+    public static final String INSTANCE_ID = "CamelSalesforceInstanceId";
 
     // parameters for Streaming API
     public static final String DEFAULT_REPLAY_ID = "defaultReplayId";
@@ -109,10 +109,10 @@ public class SalesforceEndpointConfig implements 
Cloneable {
     public static final String APPROVAL = "approval";
 
     // parameters for the RAW operation
-    public static final String RAW_PATH = "rawPath";
-    public static final String RAW_METHOD = "rawMethod";
-    public static final String RAW_QUERY_PARAMETERS = "rawQueryParameters";
-    public static final String RAW_HTTP_HEADERS = "rawHttpHeaders";
+    public static final String RAW_PATH = "CamelSalesforceRawPath";
+    public static final String RAW_METHOD = "CamelSalesforceRawMethod";
+    public static final String RAW_QUERY_PARAMETERS = 
"CamelSalesforceRawQueryParameters";
+    public static final String RAW_HTTP_HEADERS = 
"CamelSalesforceRawHttpHeaders";
 
     // default maximum authentication retries on failed authentication or
     // expired session
diff --git 
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/BulkApiV2IngestJobManualIT.java
 
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/BulkApiV2IngestJobManualIT.java
index b24263146e07..b80bf0d195ec 100644
--- 
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/BulkApiV2IngestJobManualIT.java
+++ 
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/BulkApiV2IngestJobManualIT.java
@@ -55,39 +55,39 @@ public class BulkApiV2IngestJobManualIT extends 
AbstractSalesforceTestBase {
 
         Exchange exchange = new DefaultExchange(context());
         exchange.getIn().setBody("FirstName,LastName\nTestFirst,TestLast");
-        exchange.getIn().setHeader("jobId", job.getId());
+        exchange.getIn().setHeader("CamelSalesforceJobId", job.getId());
         template.send("salesforce:bulk2CreateBatch", exchange);
         assertNull(exchange.getException());
 
         job = template().requestBody("salesforce:bulk2GetJob", job, Job.class);
         assertSame(JobStateEnum.OPEN, job.getState(), "Job state");
 
-        job = template().requestBodyAndHeader("salesforce:bulk2CloseJob", "", 
"jobId", job.getId(),
+        job = template().requestBodyAndHeader("salesforce:bulk2CloseJob", "", 
"CamelSalesforceJobId", job.getId(),
                 Job.class);
         assertEquals(JobStateEnum.UPLOAD_COMPLETE, job.getState(), "Job 
state");
 
         // wait for job to finish
         while (job.getState() != JobStateEnum.JOB_COMPLETE) {
             Thread.sleep(2000);
-            job = template().requestBodyAndHeader("salesforce:bulk2GetJob", 
"", "jobId",
+            job = template().requestBodyAndHeader("salesforce:bulk2GetJob", 
"", "CamelSalesforceJobId",
                     job.getId(), Job.class);
         }
 
         InputStream is = 
template().requestBodyAndHeader("salesforce:bulk2GetSuccessfulResults",
-                "", "jobId", job.getId(), InputStream.class);
+                "", "CamelSalesforceJobId", job.getId(), InputStream.class);
         assertNotNull(is, "Successful results");
         List<String> successful = IOUtils.readLines(is, 
StandardCharsets.UTF_8);
         assertEquals(2, successful.size());
         assertTrue(successful.get(1).contains("TestFirst"));
 
         is = 
template().requestBodyAndHeader("salesforce:bulk2GetFailedResults",
-                "", "jobId", job.getId(), InputStream.class);
+                "", "CamelSalesforceJobId", job.getId(), InputStream.class);
         assertNotNull(is, "Failed results");
         List<String> failed = IOUtils.readLines(is, StandardCharsets.UTF_8);
         assertEquals(1, failed.size());
 
         is = 
template().requestBodyAndHeader("salesforce:bulk2GetUnprocessedRecords",
-                "", "jobId", job.getId(), InputStream.class);
+                "", "CamelSalesforceJobId", job.getId(), InputStream.class);
         assertNotNull(is, "Unprocessed records");
         List<String> unprocessed = IOUtils.readLines(is, 
StandardCharsets.UTF_8);
         assertEquals(1, unprocessed.size());
@@ -104,7 +104,7 @@ public class BulkApiV2IngestJobManualIT extends 
AbstractSalesforceTestBase {
         job = template().requestBody("salesforce:bulk2GetJob", job, Job.class);
         assertSame(JobStateEnum.OPEN, job.getState(), "Job should be OPEN");
 
-        template().sendBodyAndHeader("salesforce:bulk2AbortJob", "", "jobId", 
job.getId());
+        template().sendBodyAndHeader("salesforce:bulk2AbortJob", "", 
"CamelSalesforceJobId", job.getId());
 
         job = template().requestBody("salesforce:bulk2GetJob", job, Job.class);
         assertSame(JobStateEnum.ABORTED, job.getState(), "Job state");
@@ -120,12 +120,12 @@ public class BulkApiV2IngestJobManualIT extends 
AbstractSalesforceTestBase {
         job = template().requestBody("salesforce:bulk2GetJob", job, Job.class);
         assertSame(JobStateEnum.OPEN, job.getState(), "Job should be OPEN");
 
-        template().sendBodyAndHeader("salesforce:bulk2AbortJob", "", "jobId", 
job.getId());
+        template().sendBodyAndHeader("salesforce:bulk2AbortJob", "", 
"CamelSalesforceJobId", job.getId());
 
         job = template().requestBody("salesforce:bulk2GetJob", job, Job.class);
         assertSame(JobStateEnum.ABORTED, job.getState(), "Job state");
 
-        template().sendBodyAndHeader("salesforce:bulk2DeleteJob", "", "jobId", 
job.getId());
+        template().sendBodyAndHeader("salesforce:bulk2DeleteJob", "", 
"CamelSalesforceJobId", job.getId());
 
         final Job finalJob = job;
         CamelExecutionException ex = 
Assertions.assertThrows(CamelExecutionException.class,
diff --git 
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/BulkApiV2QueryJobManualIT.java
 
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/BulkApiV2QueryJobManualIT.java
index e6549ee79b72..e9edde6cc00f 100644
--- 
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/BulkApiV2QueryJobManualIT.java
+++ 
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/BulkApiV2QueryJobManualIT.java
@@ -69,19 +69,19 @@ public class BulkApiV2QueryJobManualIT extends 
AbstractSalesforceTestBase {
         job = template().requestBody("salesforce:bulk2CreateQueryJob", job, 
QueryJob.class);
         assertNotNull(job.getId(), "JobId");
 
-        job = template().requestBodyAndHeader("salesforce:bulk2GetQueryJob", 
"", "jobId",
+        job = template().requestBodyAndHeader("salesforce:bulk2GetQueryJob", 
"", "CamelSalesforceJobId",
                 job.getId(), QueryJob.class);
 
         // wait for job to finish
         while (job.getState() != JobStateEnum.JOB_COMPLETE) {
             Thread.sleep(2000);
-            job = 
template().requestBodyAndHeader("salesforce:bulk2GetQueryJob", "", "jobId",
+            job = 
template().requestBodyAndHeader("salesforce:bulk2GetQueryJob", "", 
"CamelSalesforceJobId",
                     job.getId(), QueryJob.class);
         }
 
         Exchange exchange = new DefaultExchange(context);
-        exchange.getIn().setHeader("jobId", job.getId());
-        exchange.getIn().setHeader("maxRecords", 1);
+        exchange.getIn().setHeader("CamelSalesforceJobId", job.getId());
+        exchange.getIn().setHeader("CamelSalesforceMaxRecords", 1);
         template().send("salesforce:bulk2GetQueryJobResults?maxRecords=1",
                 exchange);
         InputStream is = exchange.getIn().getBody(InputStream.class);
@@ -93,7 +93,7 @@ public class BulkApiV2QueryJobManualIT extends 
AbstractSalesforceTestBase {
         assertNotNull(locator);
 
         exchange = new DefaultExchange(context);
-        exchange.getIn().setHeader("jobId", job.getId());
+        exchange.getIn().setHeader("CamelSalesforceJobId", job.getId());
         exchange.getIn().setHeader("locator", locator);
         template().send("salesforce:bulk2GetQueryJobResults",
                 exchange);
@@ -113,18 +113,18 @@ public class BulkApiV2QueryJobManualIT extends 
AbstractSalesforceTestBase {
         job = template().requestBody("salesforce:bulk2CreateQueryJob", job, 
QueryJob.class);
         assertNotNull(job.getId(), "JobId");
 
-        job = template().requestBodyAndHeader("salesforce:bulk2GetQueryJob", 
"", "jobId",
+        job = template().requestBodyAndHeader("salesforce:bulk2GetQueryJob", 
"", "CamelSalesforceJobId",
                 job.getId(), QueryJob.class);
 
         // wait for job to finish
         while (job.getState() != JobStateEnum.JOB_COMPLETE) {
             Thread.sleep(2000);
-            job = 
template().requestBodyAndHeader("salesforce:bulk2GetQueryJob", "", "jobId",
+            job = 
template().requestBodyAndHeader("salesforce:bulk2GetQueryJob", "", 
"CamelSalesforceJobId",
                     job.getId(), QueryJob.class);
         }
 
         InputStream is = 
template().requestBodyAndHeader("salesforce:bulk2GetQueryJobResults",
-                "", "jobId", job.getId(), InputStream.class);
+                "", "CamelSalesforceJobId", job.getId(), InputStream.class);
         assertNotNull(is, "Query Job results");
         List<String> results = IOUtils.readLines(is, StandardCharsets.UTF_8);
         assertTrue(results.size() > 0, "Query Job results");
@@ -139,7 +139,7 @@ public class BulkApiV2QueryJobManualIT extends 
AbstractSalesforceTestBase {
         job = template().requestBody("salesforce:bulk2CreateQueryJob", job, 
QueryJob.class);
         assertNotNull(job.getId(), "JobId");
 
-        template().sendBodyAndHeader("salesforce:bulk2AbortQueryJob", "", 
"jobId", job.getId());
+        template().sendBodyAndHeader("salesforce:bulk2AbortQueryJob", "", 
"CamelSalesforceJobId", job.getId());
 
         job = template().requestBody("salesforce:bulk2GetQueryJob", job, 
QueryJob.class);
         assertTrue(job.getState() == JobStateEnum.ABORTED || job.getState() == 
JobStateEnum.FAILED,
@@ -166,7 +166,7 @@ public class BulkApiV2QueryJobManualIT extends 
AbstractSalesforceTestBase {
             job = template().requestBody("salesforce:bulk2GetQueryJob", job, 
QueryJob.class);
         }
 
-        template().sendBodyAndHeader("salesforce:bulk2DeleteQueryJob", "", 
"jobId", job.getId());
+        template().sendBodyAndHeader("salesforce:bulk2DeleteQueryJob", "", 
"CamelSalesforceJobId", job.getId());
 
         final QueryJob finalJob = job;
         CamelExecutionException ex = 
Assertions.assertThrows(CamelExecutionException.class,
diff --git 
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/CompositeApiBatchManualIT.java
 
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/CompositeApiBatchManualIT.java
index 85ba765d7206..51bd9a692e11 100644
--- 
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/CompositeApiBatchManualIT.java
+++ 
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/CompositeApiBatchManualIT.java
@@ -360,7 +360,7 @@ public class CompositeApiBatchManualIT extends 
AbstractSalesforceTestBase {
                 from("direct:deleteBatchAccounts")
                         .to("salesforce:query?sObjectClass=" + 
Accounts.class.getName()
                             + "&sObjectQuery=SELECT Id FROM Account WHERE Name 
= 'Account created from Composite batch API'")
-                        
.split(simple("${body.records}")).setHeader("sObjectId", simple("${body.id}"))
+                        
.split(simple("${body.records}")).setHeader("CamelSalesforceSObjectId", 
simple("${body.id}"))
                         
.to("salesforce:deleteSObject?sObjectName=Account").end();
             }
         };
diff --git 
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/CompositeApiCollectionsManualIT.java
 
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/CompositeApiCollectionsManualIT.java
index 54d73b8d49a4..48328d0360ea 100644
--- 
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/CompositeApiCollectionsManualIT.java
+++ 
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/CompositeApiCollectionsManualIT.java
@@ -62,9 +62,9 @@ public class CompositeApiCollectionsManualIT extends 
AbstractSalesforceTestBase
 
         List<AbstractDescribedSObjectBase> result
                 = (List<AbstractDescribedSObjectBase>) 
fluentTemplate.to("salesforce:compositeRetrieveSObjectCollections")
-                        .withHeader("sObjectIds", 
Collections.singletonList(accountId))
-                        .withHeader("sObjectFields", Arrays.asList("Id", 
"Name"))
-                        .withHeader("sObjectName", "Account")
+                        .withHeader("CamelSalesforceSObjectIds", 
Collections.singletonList(accountId))
+                        .withHeader("CamelSalesforceSObjectFields", 
Arrays.asList("Id", "Name"))
+                        .withHeader("CamelSalesforceSObjectName", "Account")
                         .request();
         assertNotNull(result, "Response was null.");
         assertEquals(1, result.size());
@@ -77,7 +77,7 @@ public class CompositeApiCollectionsManualIT extends 
AbstractSalesforceTestBase
         final List<String> ids = Arrays.asList(accountId, account2Id, 
"001000000000000000");
         List<DeleteSObjectResult> result
                 = (List<DeleteSObjectResult>) 
fluentTemplate.to("salesforce:compositeDeleteSObjectCollections")
-                        .withHeader("sObjectIds", ids)
+                        .withHeader("CamelSalesforceSObjectIds", ids)
                         .request();
         assertNotNull(result, "Response was null.");
         assertEquals(3, result.size());
@@ -92,8 +92,8 @@ public class CompositeApiCollectionsManualIT extends 
AbstractSalesforceTestBase
         final List<String> ids = Arrays.asList(accountId, 
"001000000000000000");
         List<DeleteSObjectResult> result
                 = (List<DeleteSObjectResult>) 
fluentTemplate.to("salesforce:compositeDeleteSObjectCollections")
-                        .withHeader("sObjectIds", ids)
-                        .withHeader("allOrNone", constant(true))
+                        .withHeader("CamelSalesforceSObjectIds", ids)
+                        .withHeader("CamelSalesforceAllOrNone", constant(true))
                         .request();
         assertNotNull(result, "Response was null.");
         assertEquals(2, result.size());
@@ -170,7 +170,7 @@ public class CompositeApiCollectionsManualIT extends 
AbstractSalesforceTestBase
                 from("direct:deleteCompositeAccounts")
                         .to("salesforce:query?sObjectClass=" + 
Account.class.getName()
                                 + "&sObjectQuery=SELECT Id FROM Account WHERE 
Name = 'Account created from Composite Collections API'")
-                        
.split(simple("${body.records}")).setHeader("sObjectId", simple("${body.id}"))
+                        
.split(simple("${body.records}")).setHeader("CamelSalesforceSObjectId", 
simple("${body.id}"))
                         
.to("salesforce:deleteSObject?sObjectName=Account").end();
             }
         };
diff --git 
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/CompositeApiManualIT.java
 
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/CompositeApiManualIT.java
index 28874d33ac1d..797b173ec6bb 100644
--- 
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/CompositeApiManualIT.java
+++ 
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/CompositeApiManualIT.java
@@ -247,7 +247,7 @@ public class CompositeApiManualIT extends 
AbstractSalesforceTestBase {
                 from("direct:deleteBatchAccounts")
                         .to("salesforce:query?sObjectClass=" + 
Accounts.class.getName()
                             + "&sObjectQuery=SELECT Id FROM Account WHERE Name 
= 'Account created from Composite batch API'")
-                        
.split(simple("${body.records}")).setHeader("sObjectId", simple("${body.id}"))
+                        
.split(simple("${body.records}")).setHeader("CamelSalesforceSObjectId", 
simple("${body.id}"))
                         
.to("salesforce:deleteSObject?sObjectName=Account").end();
             }
         };
diff --git 
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RawPayloadTest.java
 
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RawPayloadTest.java
index 7569f7e7b8e8..79681f99fb11 100644
--- 
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RawPayloadTest.java
+++ 
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RawPayloadTest.java
@@ -145,8 +145,8 @@ public class RawPayloadTest extends 
AbstractSalesforceTestBase {
                 requestBody = "{ \"request\" : \"mock\" }";
             }
             headers = new HashMap<>();
-            headers.put("sObjectId", "mockId");
-            headers.put("sObjectIdValue", "mockIdValue");
+            headers.put("CamelSalesforceSObjectId", "mockId");
+            headers.put("CamelSalesforceSObjectIdValue", "mockIdValue");
             headers.put("id", "mockId");
             headers.put(SalesforceEndpointConfig.APEX_QUERY_PARAM_PREFIX + 
"id", "mockId");
 
diff --git 
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RestApiManualIT.java
 
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RestApiManualIT.java
index a71dee5fa347..e7980bc45df6 100644
--- 
a/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RestApiManualIT.java
+++ 
b/components/camel-salesforce/camel-salesforce-component/src/test/java/org/apache/camel/component/salesforce/RestApiManualIT.java
@@ -348,10 +348,12 @@ public class RestApiManualIT extends 
AbstractSalesforceTestBase {
         assertTrue(contactResult.getSuccess(), "Create success");
 
         // delete the Contact
-        template().requestBodyAndHeader("salesforce:deleteSObject", 
contactResult.getId(), "sObjectName", "Contact");
+        template().requestBodyAndHeader("salesforce:deleteSObject", 
contactResult.getId(), "CamelSalesforceSObjectName",
+                "Contact");
 
         // delete the Account
-        template().requestBodyAndHeader("salesforce:deleteSObject", 
accountResult.getId(), "sObjectName", "Account");
+        template().requestBodyAndHeader("salesforce:deleteSObject", 
accountResult.getId(), "CamelSalesforceSObjectName",
+                "Account");
     }
 
     @Test
@@ -373,11 +375,12 @@ public class RestApiManualIT extends 
AbstractSalesforceTestBase {
         assertNotNull(updateAccountResult);
 
         Account updatedAccount = (Account) 
template().requestBodyAndHeader("salesforce:getSObject?sObjectFields=Id,Name,Site",
-                account.getId(), "sObjectName", "Account");
+                account.getId(), "CamelSalesforceSObjectName", "Account");
         assertNull(updatedAccount.getSite());
 
         // delete the Account
-        template().requestBodyAndHeader("salesforce:deleteSObject", 
accountResult.getId(), "sObjectName", "Account");
+        template().requestBodyAndHeader("salesforce:deleteSObject", 
accountResult.getId(), "CamelSalesforceSObjectName",
+                "Account");
     }
 
     @Test
@@ -408,10 +411,12 @@ public class RestApiManualIT extends 
AbstractSalesforceTestBase {
         assertNotNull(updateContactResult);
 
         // delete the Contact
-        template().requestBodyAndHeader("salesforce:deleteSObject", 
contactResult.getId(), "sObjectName", "Contact");
+        template().requestBodyAndHeader("salesforce:deleteSObject", 
contactResult.getId(), "CamelSalesforceSObjectName",
+                "Contact");
 
         // delete the Account
-        template().requestBodyAndHeader("salesforce:deleteSObject", 
accountResult.getId(), "sObjectName", "Account");
+        template().requestBodyAndHeader("salesforce:deleteSObject", 
accountResult.getId(), "CamelSalesforceSObjectName",
+                "Account");
     }
 
     @Test
@@ -802,9 +807,10 @@ public class RestApiManualIT extends 
AbstractSalesforceTestBase {
     public void testStatus300() throws Exception {
         // get test merchandise
         // note that the header value overrides sObjectFields in endpoint
-        final Merchandise__c merchandise = 
template().requestBodyAndHeader("direct:getSObject", merchandiseId, 
"sObjectFields",
-                "Name,Description__c,Price__c,Total_Inventory__c",
-                Merchandise__c.class);
+        final Merchandise__c merchandise
+                = template().requestBodyAndHeader("direct:getSObject", 
merchandiseId, "CamelSalesforceSObjectFields",
+                        "Name,Description__c,Price__c,Total_Inventory__c",
+                        Merchandise__c.class);
         assertNotNull(merchandise);
         assertNotNull(merchandise.getName());
         assertNotNull(merchandise.getPrice__c());
@@ -844,8 +850,9 @@ public class RestApiManualIT extends 
AbstractSalesforceTestBase {
     public void testStatus400() throws Exception {
         // get test merchandise
         // note that the header value overrides sObjectFields in endpoint
-        final Merchandise__c merchandise = 
template().requestBodyAndHeader("direct:getSObject", merchandiseId, 
"sObjectFields",
-                "Description__c,Price__c", Merchandise__c.class);
+        final Merchandise__c merchandise
+                = template().requestBodyAndHeader("direct:getSObject", 
merchandiseId, "CamelSalesforceSObjectFields",
+                        "Description__c,Price__c", Merchandise__c.class);
         assertNotNull(merchandise);
         assertNotNull(merchandise.getPrice__c());
         assertNull(merchandise.getTotal_Inventory__c());
@@ -981,14 +988,14 @@ public class RestApiManualIT extends 
AbstractSalesforceTestBase {
 
                 // testQuery
                 from("direct:queryStreamResult")
-                        .setHeader("sObjectClass", 
constant(QueryRecordsLine_Item__c.class.getName()))
+                        .setHeader("CamelSalesforceSObjectClass", 
constant(QueryRecordsLine_Item__c.class.getName()))
                         .setHeader("Sforce-Query-Options", 
constant("batchSize=200"))
                         .to("salesforce:query?sObjectQuery=SELECT Id, name, 
Typeof Owner WHEN User Then Username End, recordTypeId, RecordType.Name from 
Line_Item__c Order By Name"
                             + "&streamQueryResult=true");
 
                 // testQuery
                 from("direct:queryAllStreamResult")
-                        .setHeader("sObjectClass", 
constant(QueryRecordsLine_Item__c.class.getName()))
+                        .setHeader("CamelSalesforceSObjectClass", 
constant(QueryRecordsLine_Item__c.class.getName()))
                         .setHeader("Sforce-Query-Options", 
constant("batchSize=200"))
                         .to("salesforce:queryAll?sObjectQuery=SELECT Id, name, 
Typeof Owner WHEN User Then Username End, recordTypeId, RecordType.Name from 
Line_Item__c Order By Name"
                             + "&streamQueryResult=true");
diff --git 
a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_21.adoc 
b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_21.adoc
index 9a21a138eb59..37048c4a06ed 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_21.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_21.adoc
@@ -2008,3 +2008,92 @@ transport `from` and the `irc:` `to`. Allowing untrusted 
senders to drive
 `IrcConstants.IRC_SEND_TO` without such a mapping step is not the intended use
 of the component.
 
+
+=== camel-salesforce - potential breaking change
+
+The Exchange header constants in `SalesforceEndpointConfig` have been renamed 
to
+follow the Camel naming convention used across the rest of the component 
catalog,
+so that they are governed by the default `HeaderFilterStrategy` (which only 
filters
+`Camel`/`camel`-prefixed headers). The Java field names are unchanged; only the
+header string values have changed.
+
+These parameters are dual-use: they can be supplied either as endpoint options 
(for
+example `salesforce:query?sObjectQuery=...`) or as message headers. *The 
endpoint
+option spelling is unchanged* -- only the *header* name has changed.
+
+[options="header"]
+|===
+| Constant | Previous value | New value
+| `SalesforceEndpointConfig.SOBJECT_NAME` | `sObjectName` | 
`CamelSalesforceSObjectName`
+| `SalesforceEndpointConfig.SOBJECT_ID` | `sObjectId` | 
`CamelSalesforceSObjectId`
+| `SalesforceEndpointConfig.SOBJECT_IDS` | `sObjectIds` | 
`CamelSalesforceSObjectIds`
+| `SalesforceEndpointConfig.SOBJECT_FIELDS` | `sObjectFields` | 
`CamelSalesforceSObjectFields`
+| `SalesforceEndpointConfig.SOBJECT_EXT_ID_NAME` | `sObjectIdName` | 
`CamelSalesforceSObjectIdName`
+| `SalesforceEndpointConfig.SOBJECT_EXT_ID_VALUE` | `sObjectIdValue` | 
`CamelSalesforceSObjectIdValue`
+| `SalesforceEndpointConfig.SOBJECT_BLOB_FIELD_NAME` | `sObjectBlobFieldName` 
| `CamelSalesforceSObjectBlobFieldName`
+| `SalesforceEndpointConfig.SOBJECT_CLASS` | `sObjectClass` | 
`CamelSalesforceSObjectClass`
+| `SalesforceEndpointConfig.SOBJECT_QUERY` | `sObjectQuery` | 
`CamelSalesforceSObjectQuery`
+| `SalesforceEndpointConfig.STREAM_QUERY_RESULT` | `streamQueryResult` | 
`CamelSalesforceStreamQueryResult`
+| `SalesforceEndpointConfig.SOBJECT_SEARCH` | `sObjectSearch` | 
`CamelSalesforceSObjectSearch`
+| `SalesforceEndpointConfig.APEX_METHOD` | `apexMethod` | 
`CamelSalesforceApexMethod`
+| `SalesforceEndpointConfig.APEX_URL` | `apexUrl` | `CamelSalesforceApexUrl`
+| `SalesforceEndpointConfig.APEX_QUERY_PARAM_PREFIX` | `apexQueryParam.` | 
`CamelSalesforceApexQueryParam.`
+| `SalesforceEndpointConfig.COMPOSITE_METHOD` | `compositeMethod` | 
`CamelSalesforceCompositeMethod`
+| `SalesforceEndpointConfig.LIMIT` | `limit` | `CamelSalesforceLimit`
+| `SalesforceEndpointConfig.ALL_OR_NONE` | `allOrNone` | 
`CamelSalesforceAllOrNone`
+| `SalesforceEndpointConfig.EVENT_NAME` | `eventName` | 
`CamelSalesforceEventName`
+| `SalesforceEndpointConfig.EVENT_SCHEMA_ID` | `eventSchemaId` | 
`CamelSalesforceEventSchemaId`
+| `SalesforceEndpointConfig.EVENT_SCHEMA_FORMAT` | `eventSchemaFormat` | 
`CamelSalesforceEventSchemaFormat`
+| `SalesforceEndpointConfig.CONTENT_TYPE` | `contentType` | 
`CamelSalesforceContentType`
+| `SalesforceEndpointConfig.JOB_ID` | `jobId` | `CamelSalesforceJobId`
+| `SalesforceEndpointConfig.BATCH_ID` | `batchId` | `CamelSalesforceBatchId`
+| `SalesforceEndpointConfig.RESULT_ID` | `resultId` | `CamelSalesforceResultId`
+| `SalesforceEndpointConfig.QUERY_LOCATOR` | `queryLocator` | 
`CamelSalesforceQueryLocator`
+| `SalesforceEndpointConfig.LOCATOR` | `locator` | `CamelSalesforceLocator`
+| `SalesforceEndpointConfig.MAX_RECORDS` | `maxRecords` | 
`CamelSalesforceMaxRecords`
+| `SalesforceEndpointConfig.PK_CHUNKING` | `pkChunking` | 
`CamelSalesforcePkChunking`
+| `SalesforceEndpointConfig.PK_CHUNKING_CHUNK_SIZE` | `pkChunkingChunkSize` | 
`CamelSalesforcePkChunkingChunkSize`
+| `SalesforceEndpointConfig.PK_CHUNKING_PARENT` | `pkChunkingParent` | 
`CamelSalesforcePkChunkingParent`
+| `SalesforceEndpointConfig.PK_CHUNKING_START_ROW` | `pkChunkingStartRow` | 
`CamelSalesforcePkChunkingStartRow`
+| `SalesforceEndpointConfig.REPORT_ID` | `reportId` | `CamelSalesforceReportId`
+| `SalesforceEndpointConfig.INCLUDE_DETAILS` | `includeDetails` | 
`CamelSalesforceIncludeDetails`
+| `SalesforceEndpointConfig.REPORT_METADATA` | `reportMetadata` | 
`CamelSalesforceReportMetadata`
+| `SalesforceEndpointConfig.INSTANCE_ID` | `instanceId` | 
`CamelSalesforceInstanceId`
+| `SalesforceEndpointConfig.RAW_PATH` | `rawPath` | `CamelSalesforceRawPath`
+| `SalesforceEndpointConfig.RAW_METHOD` | `rawMethod` | 
`CamelSalesforceRawMethod`
+| `SalesforceEndpointConfig.RAW_QUERY_PARAMETERS` | `rawQueryParameters` | 
`CamelSalesforceRawQueryParameters`
+| `SalesforceEndpointConfig.RAW_HTTP_HEADERS` | `rawHttpHeaders` | 
`CamelSalesforceRawHttpHeaders`
+|===
+
+Routes that reference the constants symbolically (for example
+`setHeader(SalesforceEndpointConfig.SOBJECT_QUERY, ...)`) continue to work 
without
+changes. Routes that set the value as a *header* by its literal string (for 
example
+`setHeader("sObjectQuery", ...)`) must be updated to the new value
+(`setHeader("CamelSalesforceSObjectQuery", ...)`), or preferably switch to the
+symbolic constant. The `apexQueryParam.` header prefix is likewise renamed to
+`CamelSalesforceApexQueryParam.`, so a header such as `apexQueryParam.foo` 
must now
+be set as `CamelSalesforceApexQueryParam.foo`.
+
+The configuration-only options that are never read from a message header --
+`apiVersion`, `format`, `rawPayload`, `defaultReplayId`, `fallBackReplayId`,
+`initialReplayIdMap`, `replayPreset`, `pubSubDeserializeType`, 
`pubSubPojoClass`,
+`notFoundBehaviour` and `fallbackToLatestReplayId` -- are unchanged, as is the
+Approval API `approval` / `approval.<property>` mechanism (whose 
endpoint-option and
+header spellings are intentionally identical and bound to the `approval` 
endpoint
+parameter name).
+
+==== Behaviour change: cross-transport propagation
+
+Because the renamed header values now begin with `Camel`, they are filtered by 
the
+standard transport `HeaderFilterStrategy` (`HttpHeaderFilterStrategy`,
+`JmsHeaderFilterStrategy`, etc.) when crossing a transport boundary, by design 
--
+`Camel*` headers are framework-internal and are not propagated over the wire.
+
+Routes that bridge an external transport (HTTP, JMS, ...) into a `salesforce:`
+producer and let the sender choose, for example, the SOQL query, the target 
SObject
+or the Apex endpoint via these headers must carry those values in
+non-`Camel`-prefixed application headers and map them to the corresponding
+`SalesforceEndpointConfig` constants in the route between the transport `from` 
and
+the `salesforce:` `to`. As defence-in-depth, strip inbound Camel-internal 
headers
+arriving from untrusted producers with `removeHeaders("CamelSalesforce*")` (or 
the
+broader `removeHeaders("Camel*")`) before the producer.


Reply via email to