This is an automated email from the ASF dual-hosted git repository.
davsclaus 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 064b58a1235f CAMEL-22658: Ensure goog* headers are filtered from
Google Pubsub messages (#19823)
064b58a1235f is described below
commit 064b58a1235fc005e8fcdb4aa5a1c84d11a1e626
Author: David Riseley <[email protected]>
AuthorDate: Thu Nov 6 13:52:54 2025 +0000
CAMEL-22658: Ensure goog* headers are filtered from Google Pubsub messages
(#19823)
Allow Google Pubsub HeaderFilterStrategy to be configured on the endpoint
or component
---
.../camel/catalog/components/google-pubsub.json | 12 +--
.../pubsub/GooglePubsubComponentConfigurer.java | 6 ++
.../pubsub/GooglePubsubEndpointConfigurer.java | 6 ++
.../pubsub/GooglePubsubEndpointUriFactory.java | 3 +-
.../component/google/pubsub/google-pubsub.json | 12 +--
.../google/pubsub/GooglePubsubComponent.java | 7 +-
.../google/pubsub/GooglePubsubConsumer.java | 2 +-
.../google/pubsub/GooglePubsubEndpoint.java | 19 ++++-
.../pubsub/GooglePubsubHeaderFilterStrategy.java | 4 +-
.../google/pubsub/GooglePubsubProducer.java | 2 +-
.../pubsub/consumer/CamelMessageReceiver.java | 3 +-
.../google/pubsub/unit/PubsubHeaderFilterTest.java | 37 +++++++++
.../dsl/GooglePubsubComponentBuilderFactory.java | 19 +++++
.../dsl/GooglePubsubEndpointBuilderFactory.java | 96 ++++++++++++++++++++++
14 files changed, 208 insertions(+), 20 deletions(-)
diff --git
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-pubsub.json
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-pubsub.json
index c7fd4e91b5b1..9a88de7d4c83 100644
---
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-pubsub.json
+++
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-pubsub.json
@@ -33,7 +33,8 @@
"publisherCacheSize": { "index": 6, "kind": "property", "displayName":
"Publisher Cache Size", "group": "producer", "label": "producer", "required":
false, "type": "integer", "javaType": "int", "deprecated": false, "autowired":
false, "secret": false, "description": "Maximum number of producers to cache.
This could be increased if you have producers for lots of different topics." },
"publisherCacheTimeout": { "index": 7, "kind": "property", "displayName":
"Publisher Cache Timeout", "group": "producer", "label": "producer",
"required": false, "type": "integer", "javaType": "int", "deprecated": false,
"autowired": false, "secret": false, "description": "How many milliseconds
should each producer stay alive in the cache." },
"autowiredEnabled": { "index": 8, "kind": "property", "displayName":
"Autowired Enabled", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": true, "description":
"Whether autowiring is enabled. This is used for automatic autowiring options
(the option must be marked as autowired) by looking up in the registry to find
if there is a single instance of matching t [...]
- "publisherTerminationTimeout": { "index": 9, "kind": "property",
"displayName": "Publisher Termination Timeout", "group": "advanced", "label":
"advanced", "required": false, "type": "integer", "javaType": "int",
"deprecated": false, "autowired": false, "secret": false, "description": "How
many milliseconds should a producer be allowed to terminate." }
+ "publisherTerminationTimeout": { "index": 9, "kind": "property",
"displayName": "Publisher Termination Timeout", "group": "advanced", "label":
"advanced", "required": false, "type": "integer", "javaType": "int",
"deprecated": false, "autowired": false, "secret": false, "description": "How
many milliseconds should a producer be allowed to terminate." },
+ "headerFilterStrategy": { "index": 10, "kind": "property", "displayName":
"Header Filter Strategy", "group": "filter", "label": "filter", "required":
false, "type": "object", "javaType":
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired":
false, "secret": false, "description": "To use a custom
org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel
message." }
},
"headers": {
"CamelGooglePubsubMessageId": { "index": 0, "kind": "header",
"displayName": "", "group": "common", "label": "", "required": false,
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired":
false, "secret": false, "description": "The ID of the message, assigned by the
server when the message is published.", "constantName":
"org.apache.camel.component.google.pubsub.GooglePubsubConstants#MESSAGE_ID" },
@@ -59,9 +60,10 @@
"pubsubEndpoint": { "index": 12, "kind": "parameter", "displayName":
"Pubsub Endpoint", "group": "producer (advanced)", "label":
"producer,advanced", "required": false, "type": "string", "javaType":
"java.lang.String", "deprecated": false, "autowired": false, "secret": false,
"description": "Pub\/Sub endpoint to use. Required when using message ordering,
and ensures that messages are received in order even when multiple publishers
are used" },
"retry": { "index": 13, "kind": "parameter", "displayName": "Retry",
"group": "producer (advanced)", "label": "producer,advanced", "required":
false, "type": "object", "javaType":
"com.google.api.gax.retrying.RetrySettings", "deprecated": false, "autowired":
false, "secret": false, "description": "A custom RetrySettings to control how
the publisher handles retry-able failures" },
"serializer": { "index": 14, "kind": "parameter", "displayName":
"Serializer", "group": "producer (advanced)", "label": "producer,advanced",
"required": false, "type": "object", "javaType":
"org.apache.camel.component.google.pubsub.serializer.GooglePubsubSerializer",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret": false,
"description": "A custom GooglePubsubSerializer to use for serializing message
payloads in the producer" },
- "includeAllGoogleProperties": { "index": 15, "kind": "parameter",
"displayName": "Include All Google Properties", "group": "advanced", "label":
"advanced", "required": false, "type": "boolean", "javaType": "boolean",
"deprecated": false, "autowired": false, "secret": false, "defaultValue":
false, "description": "Whether to include all Google headers when mapping from
Pubsub to Camel Message. Setting this to true will include properties such as
x-goog etc." },
- "loggerId": { "index": 16, "kind": "parameter", "displayName": "Logger
Id", "group": "advanced", "label": "advanced", "required": false, "type":
"string", "javaType": "java.lang.String", "deprecated": true, "autowired":
false, "secret": false, "description": "To use a custom logger name" },
- "authenticate": { "index": 17, "kind": "parameter", "displayName":
"Authenticate", "group": "security", "label": "security", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": true, "description": "Use Credentials
when interacting with PubSub service (no authentication is required when using
emulator)." },
- "serviceAccountKey": { "index": 18, "kind": "parameter", "displayName":
"Service Account Key", "group": "security", "label": "security", "required":
false, "type": "string", "javaType": "java.lang.String", "deprecated": false,
"autowired": false, "secret": false, "description": "The Service account key
that can be used as credentials for the PubSub publisher\/subscriber. It can be
loaded by default from classpath, but you can prefix with classpath:, file:, or
http: to load the resour [...]
+ "headerFilterStrategy": { "index": 15, "kind": "parameter", "displayName":
"Header Filter Strategy", "group": "advanced", "label": "advanced", "required":
false, "type": "object", "javaType":
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired":
false, "secret": false, "description": "To use a custom HeaderFilterStrategy to
filter headers to and from Camel message." },
+ "includeAllGoogleProperties": { "index": 16, "kind": "parameter",
"displayName": "Include All Google Properties", "group": "advanced", "label":
"advanced", "required": false, "type": "boolean", "javaType": "boolean",
"deprecated": false, "autowired": false, "secret": false, "defaultValue":
false, "description": "Whether to include all Google headers when mapping from
Pubsub to Camel Message. Setting this to true will include properties such as
x-goog etc." },
+ "loggerId": { "index": 17, "kind": "parameter", "displayName": "Logger
Id", "group": "advanced", "label": "advanced", "required": false, "type":
"string", "javaType": "java.lang.String", "deprecated": true, "autowired":
false, "secret": false, "description": "To use a custom logger name" },
+ "authenticate": { "index": 18, "kind": "parameter", "displayName":
"Authenticate", "group": "security", "label": "security", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": true, "description": "Use Credentials
when interacting with PubSub service (no authentication is required when using
emulator)." },
+ "serviceAccountKey": { "index": 19, "kind": "parameter", "displayName":
"Service Account Key", "group": "security", "label": "security", "required":
false, "type": "string", "javaType": "java.lang.String", "deprecated": false,
"autowired": false, "secret": false, "description": "The Service account key
that can be used as credentials for the PubSub publisher\/subscriber. It can be
loaded by default from classpath, but you can prefix with classpath:, file:, or
http: to load the resour [...]
}
}
diff --git
a/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubComponentConfigurer.java
b/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubComponentConfigurer.java
index 5a577af5ae7a..f0e979a507ed 100644
---
a/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubComponentConfigurer.java
+++
b/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubComponentConfigurer.java
@@ -29,6 +29,8 @@ public class GooglePubsubComponentConfigurer extends
PropertyConfigurerSupport i
case "bridgeerrorhandler":
case "bridgeErrorHandler":
target.setBridgeErrorHandler(property(camelContext, boolean.class, value));
return true;
case "endpoint": target.setEndpoint(property(camelContext,
java.lang.String.class, value)); return true;
+ case "headerfilterstrategy":
+ case "headerFilterStrategy":
target.setHeaderFilterStrategy(property(camelContext,
org.apache.camel.spi.HeaderFilterStrategy.class, value)); return true;
case "lazystartproducer":
case "lazyStartProducer":
target.setLazyStartProducer(property(camelContext, boolean.class, value));
return true;
case "publishercachesize":
@@ -54,6 +56,8 @@ public class GooglePubsubComponentConfigurer extends
PropertyConfigurerSupport i
case "bridgeerrorhandler":
case "bridgeErrorHandler": return boolean.class;
case "endpoint": return java.lang.String.class;
+ case "headerfilterstrategy":
+ case "headerFilterStrategy": return
org.apache.camel.spi.HeaderFilterStrategy.class;
case "lazystartproducer":
case "lazyStartProducer": return boolean.class;
case "publishercachesize":
@@ -80,6 +84,8 @@ public class GooglePubsubComponentConfigurer extends
PropertyConfigurerSupport i
case "bridgeerrorhandler":
case "bridgeErrorHandler": return target.isBridgeErrorHandler();
case "endpoint": return target.getEndpoint();
+ case "headerfilterstrategy":
+ case "headerFilterStrategy": return target.getHeaderFilterStrategy();
case "lazystartproducer":
case "lazyStartProducer": return target.isLazyStartProducer();
case "publishercachesize":
diff --git
a/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpointConfigurer.java
b/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpointConfigurer.java
index c9b1c82003bc..6f60fab7267e 100644
---
a/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpointConfigurer.java
+++
b/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpointConfigurer.java
@@ -34,6 +34,8 @@ public class GooglePubsubEndpointConfigurer extends
PropertyConfigurerSupport im
case "exceptionHandler":
target.setExceptionHandler(property(camelContext,
org.apache.camel.spi.ExceptionHandler.class, value)); return true;
case "exchangepattern":
case "exchangePattern":
target.setExchangePattern(property(camelContext,
org.apache.camel.ExchangePattern.class, value)); return true;
+ case "headerfilterstrategy":
+ case "headerFilterStrategy":
target.setHeaderFilterStrategy(property(camelContext,
org.apache.camel.spi.HeaderFilterStrategy.class, value)); return true;
case "includeallgoogleproperties":
case "includeAllGoogleProperties":
target.setIncludeAllGoogleProperties(property(camelContext, boolean.class,
value)); return true;
case "lazystartproducer":
@@ -77,6 +79,8 @@ public class GooglePubsubEndpointConfigurer extends
PropertyConfigurerSupport im
case "exceptionHandler": return
org.apache.camel.spi.ExceptionHandler.class;
case "exchangepattern":
case "exchangePattern": return org.apache.camel.ExchangePattern.class;
+ case "headerfilterstrategy":
+ case "headerFilterStrategy": return
org.apache.camel.spi.HeaderFilterStrategy.class;
case "includeallgoogleproperties":
case "includeAllGoogleProperties": return boolean.class;
case "lazystartproducer":
@@ -116,6 +120,8 @@ public class GooglePubsubEndpointConfigurer extends
PropertyConfigurerSupport im
case "exceptionHandler": return target.getExceptionHandler();
case "exchangepattern":
case "exchangePattern": return target.getExchangePattern();
+ case "headerfilterstrategy":
+ case "headerFilterStrategy": return target.getHeaderFilterStrategy();
case "includeallgoogleproperties":
case "includeAllGoogleProperties": return
target.isIncludeAllGoogleProperties();
case "lazystartproducer":
diff --git
a/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpointUriFactory.java
b/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpointUriFactory.java
index cdbdb79d556b..2649a9a6eef3 100644
---
a/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpointUriFactory.java
+++
b/components/camel-google/camel-google-pubsub/src/generated/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpointUriFactory.java
@@ -23,7 +23,7 @@ public class GooglePubsubEndpointUriFactory extends
org.apache.camel.support.com
private static final Set<String> SECRET_PROPERTY_NAMES;
private static final Map<String, String> MULTI_VALUE_PREFIXES;
static {
- Set<String> props = new HashSet<>(19);
+ Set<String> props = new HashSet<>(20);
props.add("ackMode");
props.add("authenticate");
props.add("bridgeErrorHandler");
@@ -31,6 +31,7 @@ public class GooglePubsubEndpointUriFactory extends
org.apache.camel.support.com
props.add("destinationName");
props.add("exceptionHandler");
props.add("exchangePattern");
+ props.add("headerFilterStrategy");
props.add("includeAllGoogleProperties");
props.add("lazyStartProducer");
props.add("loggerId");
diff --git
a/components/camel-google/camel-google-pubsub/src/generated/resources/META-INF/org/apache/camel/component/google/pubsub/google-pubsub.json
b/components/camel-google/camel-google-pubsub/src/generated/resources/META-INF/org/apache/camel/component/google/pubsub/google-pubsub.json
index c7fd4e91b5b1..9a88de7d4c83 100644
---
a/components/camel-google/camel-google-pubsub/src/generated/resources/META-INF/org/apache/camel/component/google/pubsub/google-pubsub.json
+++
b/components/camel-google/camel-google-pubsub/src/generated/resources/META-INF/org/apache/camel/component/google/pubsub/google-pubsub.json
@@ -33,7 +33,8 @@
"publisherCacheSize": { "index": 6, "kind": "property", "displayName":
"Publisher Cache Size", "group": "producer", "label": "producer", "required":
false, "type": "integer", "javaType": "int", "deprecated": false, "autowired":
false, "secret": false, "description": "Maximum number of producers to cache.
This could be increased if you have producers for lots of different topics." },
"publisherCacheTimeout": { "index": 7, "kind": "property", "displayName":
"Publisher Cache Timeout", "group": "producer", "label": "producer",
"required": false, "type": "integer", "javaType": "int", "deprecated": false,
"autowired": false, "secret": false, "description": "How many milliseconds
should each producer stay alive in the cache." },
"autowiredEnabled": { "index": 8, "kind": "property", "displayName":
"Autowired Enabled", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": true, "description":
"Whether autowiring is enabled. This is used for automatic autowiring options
(the option must be marked as autowired) by looking up in the registry to find
if there is a single instance of matching t [...]
- "publisherTerminationTimeout": { "index": 9, "kind": "property",
"displayName": "Publisher Termination Timeout", "group": "advanced", "label":
"advanced", "required": false, "type": "integer", "javaType": "int",
"deprecated": false, "autowired": false, "secret": false, "description": "How
many milliseconds should a producer be allowed to terminate." }
+ "publisherTerminationTimeout": { "index": 9, "kind": "property",
"displayName": "Publisher Termination Timeout", "group": "advanced", "label":
"advanced", "required": false, "type": "integer", "javaType": "int",
"deprecated": false, "autowired": false, "secret": false, "description": "How
many milliseconds should a producer be allowed to terminate." },
+ "headerFilterStrategy": { "index": 10, "kind": "property", "displayName":
"Header Filter Strategy", "group": "filter", "label": "filter", "required":
false, "type": "object", "javaType":
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired":
false, "secret": false, "description": "To use a custom
org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel
message." }
},
"headers": {
"CamelGooglePubsubMessageId": { "index": 0, "kind": "header",
"displayName": "", "group": "common", "label": "", "required": false,
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired":
false, "secret": false, "description": "The ID of the message, assigned by the
server when the message is published.", "constantName":
"org.apache.camel.component.google.pubsub.GooglePubsubConstants#MESSAGE_ID" },
@@ -59,9 +60,10 @@
"pubsubEndpoint": { "index": 12, "kind": "parameter", "displayName":
"Pubsub Endpoint", "group": "producer (advanced)", "label":
"producer,advanced", "required": false, "type": "string", "javaType":
"java.lang.String", "deprecated": false, "autowired": false, "secret": false,
"description": "Pub\/Sub endpoint to use. Required when using message ordering,
and ensures that messages are received in order even when multiple publishers
are used" },
"retry": { "index": 13, "kind": "parameter", "displayName": "Retry",
"group": "producer (advanced)", "label": "producer,advanced", "required":
false, "type": "object", "javaType":
"com.google.api.gax.retrying.RetrySettings", "deprecated": false, "autowired":
false, "secret": false, "description": "A custom RetrySettings to control how
the publisher handles retry-able failures" },
"serializer": { "index": 14, "kind": "parameter", "displayName":
"Serializer", "group": "producer (advanced)", "label": "producer,advanced",
"required": false, "type": "object", "javaType":
"org.apache.camel.component.google.pubsub.serializer.GooglePubsubSerializer",
"deprecated": false, "deprecationNote": "", "autowired": true, "secret": false,
"description": "A custom GooglePubsubSerializer to use for serializing message
payloads in the producer" },
- "includeAllGoogleProperties": { "index": 15, "kind": "parameter",
"displayName": "Include All Google Properties", "group": "advanced", "label":
"advanced", "required": false, "type": "boolean", "javaType": "boolean",
"deprecated": false, "autowired": false, "secret": false, "defaultValue":
false, "description": "Whether to include all Google headers when mapping from
Pubsub to Camel Message. Setting this to true will include properties such as
x-goog etc." },
- "loggerId": { "index": 16, "kind": "parameter", "displayName": "Logger
Id", "group": "advanced", "label": "advanced", "required": false, "type":
"string", "javaType": "java.lang.String", "deprecated": true, "autowired":
false, "secret": false, "description": "To use a custom logger name" },
- "authenticate": { "index": 17, "kind": "parameter", "displayName":
"Authenticate", "group": "security", "label": "security", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": true, "description": "Use Credentials
when interacting with PubSub service (no authentication is required when using
emulator)." },
- "serviceAccountKey": { "index": 18, "kind": "parameter", "displayName":
"Service Account Key", "group": "security", "label": "security", "required":
false, "type": "string", "javaType": "java.lang.String", "deprecated": false,
"autowired": false, "secret": false, "description": "The Service account key
that can be used as credentials for the PubSub publisher\/subscriber. It can be
loaded by default from classpath, but you can prefix with classpath:, file:, or
http: to load the resour [...]
+ "headerFilterStrategy": { "index": 15, "kind": "parameter", "displayName":
"Header Filter Strategy", "group": "advanced", "label": "advanced", "required":
false, "type": "object", "javaType":
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired":
false, "secret": false, "description": "To use a custom HeaderFilterStrategy to
filter headers to and from Camel message." },
+ "includeAllGoogleProperties": { "index": 16, "kind": "parameter",
"displayName": "Include All Google Properties", "group": "advanced", "label":
"advanced", "required": false, "type": "boolean", "javaType": "boolean",
"deprecated": false, "autowired": false, "secret": false, "defaultValue":
false, "description": "Whether to include all Google headers when mapping from
Pubsub to Camel Message. Setting this to true will include properties such as
x-goog etc." },
+ "loggerId": { "index": 17, "kind": "parameter", "displayName": "Logger
Id", "group": "advanced", "label": "advanced", "required": false, "type":
"string", "javaType": "java.lang.String", "deprecated": true, "autowired":
false, "secret": false, "description": "To use a custom logger name" },
+ "authenticate": { "index": 18, "kind": "parameter", "displayName":
"Authenticate", "group": "security", "label": "security", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": true, "description": "Use Credentials
when interacting with PubSub service (no authentication is required when using
emulator)." },
+ "serviceAccountKey": { "index": 19, "kind": "parameter", "displayName":
"Service Account Key", "group": "security", "label": "security", "required":
false, "type": "string", "javaType": "java.lang.String", "deprecated": false,
"autowired": false, "secret": false, "description": "The Service account key
that can be used as credentials for the PubSub publisher\/subscriber. It can be
loaded by default from classpath, but you can prefix with classpath:, file:, or
http: to load the resour [...]
}
}
diff --git
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubComponent.java
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubComponent.java
index 04616746ca86..fd2fe9c00dff 100644
---
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubComponent.java
+++
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubComponent.java
@@ -49,7 +49,7 @@ import org.apache.camel.Endpoint;
import org.apache.camel.RuntimeCamelException;
import org.apache.camel.spi.Metadata;
import org.apache.camel.spi.annotations.Component;
-import org.apache.camel.support.DefaultComponent;
+import org.apache.camel.support.HeaderFilterStrategyComponent;
import org.apache.camel.support.ResourceHelper;
import org.apache.camel.util.ObjectHelper;
import org.apache.camel.util.StringHelper;
@@ -61,7 +61,7 @@ import org.threeten.bp.Duration;
* Represents the component that manages {@link GooglePubsubEndpoint}.
*/
@Component("google-pubsub")
-public class GooglePubsubComponent extends DefaultComponent {
+public class GooglePubsubComponent extends HeaderFilterStrategyComponent {
private static final Logger LOG =
LoggerFactory.getLogger(GooglePubsubComponent.class);
@Metadata(label = "common",
@@ -128,6 +128,9 @@ public class GooglePubsubComponent extends DefaultComponent
{
pubsubEndpoint.setDestinationName(parts[1]);
pubsubEndpoint.setServiceAccountKey(serviceAccountKey);
pubsubEndpoint.setAuthenticate(authenticate);
+ if (getHeaderFilterStrategy() != null) {
+ pubsubEndpoint.setHeaderFilterStrategy(getHeaderFilterStrategy());
+ }
setProperties(pubsubEndpoint, parameters);
diff --git
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubConsumer.java
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubConsumer.java
index 7c2a4afdbcf7..0848f88f6c98 100644
---
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubConsumer.java
+++
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubConsumer.java
@@ -73,7 +73,7 @@ public class GooglePubsubConsumer extends DefaultConsumer {
}
localLog = LoggerFactory.getLogger(loggerId);
- headerFilterStrategy = new
GooglePubsubHeaderFilterStrategy(endpoint.isIncludeAllGoogleProperties());
+ headerFilterStrategy = endpoint.getHeaderFilterStrategy();
}
@Override
diff --git
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpoint.java
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpoint.java
index 48f15df8a833..2fdec64f2e7c 100644
---
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpoint.java
+++
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubEndpoint.java
@@ -42,7 +42,7 @@ import org.slf4j.LoggerFactory;
@UriEndpoint(firstVersion = "2.19.0", scheme = "google-pubsub", title =
"Google Pubsub",
syntax = "google-pubsub:projectId:destinationName", category = {
Category.CLOUD, Category.MESSAGING },
headersClass = GooglePubsubConstants.class)
-public class GooglePubsubEndpoint extends DefaultEndpoint implements
EndpointServiceLocation {
+public class GooglePubsubEndpoint extends DefaultEndpoint implements
EndpointServiceLocation, HeaderFilterStrategyAware {
private Logger log;
@@ -98,6 +98,9 @@ public class GooglePubsubEndpoint extends DefaultEndpoint
implements EndpointSer
description = "Whether to include all Google headers when
mapping from Pubsub to Camel Message."
+ " Setting this to true will include properties
such as x-goog etc.")
private boolean includeAllGoogleProperties;
+ @UriParam(label = "advanced",
+ description = "To use a custom HeaderFilterStrategy to filter
headers to and from Camel message.")
+ private HeaderFilterStrategy headerFilterStrategy;
public GooglePubsubEndpoint(String uri, Component component) {
super(uri, component);
@@ -126,6 +129,10 @@ public class GooglePubsubEndpoint extends DefaultEndpoint
implements EndpointSer
log.trace("Project ID: {}", this.projectId);
log.trace("Destination Name: {}", this.destinationName);
+
+ if (headerFilterStrategy == null) {
+ headerFilterStrategy = new
GooglePubsubHeaderFilterStrategy(includeAllGoogleProperties);
+ }
}
@Override
@@ -291,4 +298,14 @@ public class GooglePubsubEndpoint extends DefaultEndpoint
implements EndpointSer
}
return null;
}
+
+ @Override
+ public HeaderFilterStrategy getHeaderFilterStrategy() {
+ return headerFilterStrategy;
+ }
+
+ @Override
+ public void setHeaderFilterStrategy(HeaderFilterStrategy
headerFilterStrategy) {
+ this.headerFilterStrategy = headerFilterStrategy;
+ }
}
diff --git
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubHeaderFilterStrategy.java
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubHeaderFilterStrategy.java
index 7232a5c2c6d4..10f513c5924c 100644
---
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubHeaderFilterStrategy.java
+++
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubHeaderFilterStrategy.java
@@ -34,14 +34,14 @@ public class GooglePubsubHeaderFilterStrategy extends
DefaultHeaderFilterStrateg
}
protected void ignoreGoogProperties() {
- String[] filterStartWith = new
String[DefaultHeaderFilterStrategy.CAMEL_FILTER_STARTS_WITH.length + 2];
+ String[] filterStartWith = new
String[DefaultHeaderFilterStrategy.CAMEL_FILTER_STARTS_WITH.length + 3];
System.arraycopy(DefaultHeaderFilterStrategy.CAMEL_FILTER_STARTS_WITH,
0,
filterStartWith, 0,
DefaultHeaderFilterStrategy.CAMEL_FILTER_STARTS_WITH.length);
filterStartWith[DefaultHeaderFilterStrategy.CAMEL_FILTER_STARTS_WITH.length] =
"x-goog";
filterStartWith[DefaultHeaderFilterStrategy.CAMEL_FILTER_STARTS_WITH.length +
1] = "X-GOOG";
+
filterStartWith[DefaultHeaderFilterStrategy.CAMEL_FILTER_STARTS_WITH.length +
2] = "goog";
setOutFilterStartsWith(filterStartWith);
setInFilterStartsWith(filterStartWith);
- getOutFilter().add("google-cloud-resource-prefix");
getOutFilter().add("grpc-timeout");
}
diff --git
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubProducer.java
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubProducer.java
index 9c2bc1f7b662..c2b01a985739 100644
---
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubProducer.java
+++
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/GooglePubsubProducer.java
@@ -52,7 +52,7 @@ public class GooglePubsubProducer extends DefaultProducer {
}
logger = LoggerFactory.getLogger(loggerId);
- headerFilterStrategy = new
GooglePubsubHeaderFilterStrategy(endpoint.isIncludeAllGoogleProperties());
+ headerFilterStrategy = endpoint.getHeaderFilterStrategy();
}
/**
diff --git
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/consumer/CamelMessageReceiver.java
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/consumer/CamelMessageReceiver.java
index 4169c2630f33..ae412505d3d2 100644
---
a/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/consumer/CamelMessageReceiver.java
+++
b/components/camel-google/camel-google-pubsub/src/main/java/org/apache/camel/component/google/pubsub/consumer/CamelMessageReceiver.java
@@ -25,7 +25,6 @@ import org.apache.camel.Processor;
import org.apache.camel.component.google.pubsub.GooglePubsubConstants;
import org.apache.camel.component.google.pubsub.GooglePubsubConsumer;
import org.apache.camel.component.google.pubsub.GooglePubsubEndpoint;
-import
org.apache.camel.component.google.pubsub.GooglePubsubHeaderFilterStrategy;
import org.apache.camel.spi.HeaderFilterStrategy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -47,7 +46,7 @@ public class CamelMessageReceiver implements MessageReceiver {
loggerId = this.getClass().getName();
}
localLog = LoggerFactory.getLogger(loggerId);
- headerFilterStrategy = new
GooglePubsubHeaderFilterStrategy(endpoint.isIncludeAllGoogleProperties());
+ headerFilterStrategy = endpoint.getHeaderFilterStrategy();
}
@Override
diff --git
a/components/camel-google/camel-google-pubsub/src/test/java/org/apache/camel/component/google/pubsub/unit/PubsubHeaderFilterTest.java
b/components/camel-google/camel-google-pubsub/src/test/java/org/apache/camel/component/google/pubsub/unit/PubsubHeaderFilterTest.java
new file mode 100644
index 000000000000..74ea685c3fda
--- /dev/null
+++
b/components/camel-google/camel-google-pubsub/src/test/java/org/apache/camel/component/google/pubsub/unit/PubsubHeaderFilterTest.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.google.pubsub.unit;
+
+import org.apache.camel.Exchange;
+import
org.apache.camel.component.google.pubsub.GooglePubsubHeaderFilterStrategy;
+import org.apache.camel.component.google.pubsub.PubsubTestSupport;
+import org.apache.camel.support.DefaultExchange;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class PubsubHeaderFilterTest extends PubsubTestSupport {
+ @ParameterizedTest
+ @ValueSource(strings = { "google-header", "X-GOOGLE-HEADER",
"x-google-header" })
+ public void testPubsubHeaderFilter(String headerName) {
+ GooglePubsubHeaderFilterStrategy googlePubsubHeaderFilterStrategy =
new GooglePubsubHeaderFilterStrategy(false);
+ Exchange exchange = new DefaultExchange(context);
+
assertTrue(googlePubsubHeaderFilterStrategy.applyFilterToExternalHeaders(headerName,
"value", exchange),
+ headerName + " not filtered");
+ }
+}
diff --git
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/GooglePubsubComponentBuilderFactory.java
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/GooglePubsubComponentBuilderFactory.java
index 118cf635865a..744ff70df49b 100644
---
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/GooglePubsubComponentBuilderFactory.java
+++
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/GooglePubsubComponentBuilderFactory.java
@@ -238,6 +238,24 @@ public interface GooglePubsubComponentBuilderFactory {
doSetProperty("publisherTerminationTimeout",
publisherTerminationTimeout);
return this;
}
+
+ /**
+ * To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter
+ * header to and from Camel message.
+ *
+ * The option is a:
+ * <code>org.apache.camel.spi.HeaderFilterStrategy</code>
+ * type.
+ *
+ * Group: filter
+ *
+ * @param headerFilterStrategy the value to set
+ * @return the dsl builder
+ */
+ default GooglePubsubComponentBuilder
headerFilterStrategy(org.apache.camel.spi.HeaderFilterStrategy
headerFilterStrategy) {
+ doSetProperty("headerFilterStrategy", headerFilterStrategy);
+ return this;
+ }
}
class GooglePubsubComponentBuilderImpl
@@ -263,6 +281,7 @@ public interface GooglePubsubComponentBuilderFactory {
case "publisherCacheTimeout": ((GooglePubsubComponent)
component).setPublisherCacheTimeout((int) value); return true;
case "autowiredEnabled": ((GooglePubsubComponent)
component).setAutowiredEnabled((boolean) value); return true;
case "publisherTerminationTimeout": ((GooglePubsubComponent)
component).setPublisherTerminationTimeout((int) value); return true;
+ case "headerFilterStrategy": ((GooglePubsubComponent)
component).setHeaderFilterStrategy((org.apache.camel.spi.HeaderFilterStrategy)
value); return true;
default: return false;
}
}
diff --git
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/GooglePubsubEndpointBuilderFactory.java
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/GooglePubsubEndpointBuilderFactory.java
index 0cad250eacaa..d6ee6fa5a903 100644
---
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/GooglePubsubEndpointBuilderFactory.java
+++
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/GooglePubsubEndpointBuilderFactory.java
@@ -380,6 +380,38 @@ public interface GooglePubsubEndpointBuilderFactory {
doSetProperty("synchronousPull", synchronousPull);
return this;
}
+ /**
+ * To use a custom HeaderFilterStrategy to filter headers to and from
+ * Camel message.
+ *
+ * The option is a:
+ * <code>org.apache.camel.spi.HeaderFilterStrategy</code> type.
+ *
+ * Group: advanced
+ *
+ * @param headerFilterStrategy the value to set
+ * @return the dsl builder
+ */
+ default AdvancedGooglePubsubEndpointConsumerBuilder
headerFilterStrategy(org.apache.camel.spi.HeaderFilterStrategy
headerFilterStrategy) {
+ doSetProperty("headerFilterStrategy", headerFilterStrategy);
+ return this;
+ }
+ /**
+ * To use a custom HeaderFilterStrategy to filter headers to and from
+ * Camel message.
+ *
+ * The option will be converted to a
+ * <code>org.apache.camel.spi.HeaderFilterStrategy</code> type.
+ *
+ * Group: advanced
+ *
+ * @param headerFilterStrategy the value to set
+ * @return the dsl builder
+ */
+ default AdvancedGooglePubsubEndpointConsumerBuilder
headerFilterStrategy(String headerFilterStrategy) {
+ doSetProperty("headerFilterStrategy", headerFilterStrategy);
+ return this;
+ }
/**
* Whether to include all Google headers when mapping from Pubsub to
* Camel Message. Setting this to true will include properties such as
@@ -656,6 +688,38 @@ public interface GooglePubsubEndpointBuilderFactory {
doSetProperty("serializer", serializer);
return this;
}
+ /**
+ * To use a custom HeaderFilterStrategy to filter headers to and from
+ * Camel message.
+ *
+ * The option is a:
+ * <code>org.apache.camel.spi.HeaderFilterStrategy</code> type.
+ *
+ * Group: advanced
+ *
+ * @param headerFilterStrategy the value to set
+ * @return the dsl builder
+ */
+ default AdvancedGooglePubsubEndpointProducerBuilder
headerFilterStrategy(org.apache.camel.spi.HeaderFilterStrategy
headerFilterStrategy) {
+ doSetProperty("headerFilterStrategy", headerFilterStrategy);
+ return this;
+ }
+ /**
+ * To use a custom HeaderFilterStrategy to filter headers to and from
+ * Camel message.
+ *
+ * The option will be converted to a
+ * <code>org.apache.camel.spi.HeaderFilterStrategy</code> type.
+ *
+ * Group: advanced
+ *
+ * @param headerFilterStrategy the value to set
+ * @return the dsl builder
+ */
+ default AdvancedGooglePubsubEndpointProducerBuilder
headerFilterStrategy(String headerFilterStrategy) {
+ doSetProperty("headerFilterStrategy", headerFilterStrategy);
+ return this;
+ }
/**
* Whether to include all Google headers when mapping from Pubsub to
* Camel Message. Setting this to true will include properties such as
@@ -780,6 +844,38 @@ public interface GooglePubsubEndpointBuilderFactory {
return (GooglePubsubEndpointBuilder) this;
}
+ /**
+ * To use a custom HeaderFilterStrategy to filter headers to and from
+ * Camel message.
+ *
+ * The option is a:
+ * <code>org.apache.camel.spi.HeaderFilterStrategy</code> type.
+ *
+ * Group: advanced
+ *
+ * @param headerFilterStrategy the value to set
+ * @return the dsl builder
+ */
+ default AdvancedGooglePubsubEndpointBuilder
headerFilterStrategy(org.apache.camel.spi.HeaderFilterStrategy
headerFilterStrategy) {
+ doSetProperty("headerFilterStrategy", headerFilterStrategy);
+ return this;
+ }
+ /**
+ * To use a custom HeaderFilterStrategy to filter headers to and from
+ * Camel message.
+ *
+ * The option will be converted to a
+ * <code>org.apache.camel.spi.HeaderFilterStrategy</code> type.
+ *
+ * Group: advanced
+ *
+ * @param headerFilterStrategy the value to set
+ * @return the dsl builder
+ */
+ default AdvancedGooglePubsubEndpointBuilder
headerFilterStrategy(String headerFilterStrategy) {
+ doSetProperty("headerFilterStrategy", headerFilterStrategy);
+ return this;
+ }
/**
* Whether to include all Google headers when mapping from Pubsub to
* Camel Message. Setting this to true will include properties such as