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

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


The following commit(s) were added to refs/heads/master by this push:
     new 0d2b91b  CAMEL-13631: PropertyBindingSupport to support key filtering 
and transformation
0d2b91b is described below

commit 0d2b91bb96d0cd89969d2b1a65a0a2265acfea05
Author: lburgazzoli <lburgazz...@gmail.com>
AuthorDate: Mon Jun 10 18:50:24 2019 +0200

    CAMEL-13631: PropertyBindingSupport to support key filtering and 
transformation
---
 .../camel/support/PropertyBindingSupportTest.java  | 25 ++++++++
 .../camel/support/PropertyBindingSupport.java      | 73 +++++++++++++++++++---
 2 files changed, 91 insertions(+), 7 deletions(-)

diff --git 
a/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportTest.java
index 694abfb..f92edb0 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/support/PropertyBindingSupportTest.java
@@ -70,6 +70,31 @@ public class PropertyBindingSupportTest extends 
ContextTestSupport {
     }
 
     @Test
+    public void testBindPropertiesWithOptionPrefix() throws Exception {
+        Foo foo = new Foo();
+
+        Map<String, Object> prop = new HashMap<>();
+        prop.put("my.prefix.name", "James");
+        prop.put("my.prefix.bar.age", "33");
+        prop.put("my.prefix.bar.{{committer}}", "true");
+        prop.put("my.prefix.bar.gold-customer", "true");
+        prop.put("my.prefix.bar.work.id", "123");
+        prop.put("my.prefix.bar.work.name", "{{companyName}}");
+        prop.put("my.other.prefix.something", "test");
+
+        PropertyBindingSupport.bindProperties(context, foo, prop, 
"my.prefix.");
+
+        assertEquals("James", foo.getName());
+        assertEquals(33, foo.getBar().getAge());
+        assertTrue(foo.getBar().isRider());
+        assertTrue(foo.getBar().isGoldCustomer());
+        assertEquals(123, foo.getBar().getWork().getId());
+        assertEquals("Acme", foo.getBar().getWork().getName());
+        assertTrue(prop.containsKey("my.other.prefix.something"));
+        assertEquals(1, prop.size());
+    }
+
+    @Test
     public void testNested() throws Exception {
         Foo foo = new Foo();
 
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java
 
b/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java
index 468ef3e..be3ee8f 100644
--- 
a/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java
+++ 
b/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java
@@ -47,7 +47,6 @@ import static org.apache.camel.util.ObjectHelper.isNotEmpty;
  * This implementations reuses parts of {@link IntrospectionSupport}.
  */
 public final class PropertyBindingSupport {
-
     /**
      * To use a fluent builder style to configure this property binding 
support.
      */
@@ -58,6 +57,7 @@ public final class PropertyBindingSupport {
         private boolean reference = true;
         private boolean placeholder = true;
         private boolean fluentBuilder = true;
+        private String optionPrefix;
 
         /**
          * Whether nesting is in use
@@ -101,6 +101,15 @@ public final class PropertyBindingSupport {
         }
 
         /**
+         * Whether properties should be filtered by prefix.         *
+         * Note that the prefix is removed from the key before the property is 
bound.
+         */
+        public Builder withOptionPrefix(String optionPrefix) {
+            this.optionPrefix = optionPrefix;
+            return this;
+        }
+
+        /**
          * Binds the properties to the target object, and removes the property 
that was bound from properties.
          *
          * @param camelContext  the camel context
@@ -113,7 +122,7 @@ public final class PropertyBindingSupport {
             org.apache.camel.util.ObjectHelper.notNull(target, "target");
             org.apache.camel.util.ObjectHelper.notNull(properties, 
"properties");
 
-            return bindProperties(camelContext, target, properties, nesting, 
deepNesting, fluentBuilder, reference, placeholder);
+            return bindProperties(camelContext, target, properties, 
optionPrefix, nesting, deepNesting, fluentBuilder, reference, placeholder);
         }
 
     }
@@ -258,15 +267,51 @@ public final class PropertyBindingSupport {
      * @return              true if one or more properties was bound
      */
     public static boolean bindProperties(CamelContext camelContext, Object 
target, Map<String, Object> properties) {
-        return bindProperties(camelContext, target, properties, true, true, 
true, true, true);
+        return bindProperties(camelContext, target, properties, null);
     }
 
     /**
-     * Binds the properties to the target object, and removes the property 
that was bound from properties.
+     * Binds the properties with the given prefix to the target object, and 
removes the property that was bound from properties.
+     * Note that the prefix is removed from the key before the property is 
bound.
+     *
+     * @param camelContext  the camel context
+     * @param target        the target object
+     * @param properties    the properties where the bound properties will be 
removed from
+     * @param optionPrefix  the prefix used to filter properties
+     * @return              true if one or more properties was bound
+     */
+    public static boolean bindProperties(CamelContext camelContext, Object 
target, Map<String, Object> properties, String optionPrefix) {
+        return bindProperties(camelContext, target, properties, optionPrefix, 
true, true, true, true, true);
+    }
+
+    /**
+     * Binds the properties with the given prefix to the target object, and 
removes the property that was bound from properties.
+     *
+     * @param camelContext  the camel context
+     * @param target        the target object
+     * @param properties    the properties where the bound properties will be 
removed from
+     * @param nesting       whether nesting is in use
+     * @param deepNesting   whether deep nesting is in use, where Camel will 
attempt to walk as deep as possible by creating new objects in the OGNL graph if
+     *                      a property has a setter and the object can be 
created from a default no-arg constructor.
+     * @param fluentBuilder whether fluent builder is allowed as a valid 
getter/setter
+     * @param reference     whether reference parameter (syntax starts with #) 
is in use
+     * @param placeholder   whether to use Camels property placeholder to 
resolve placeholders on keys and values
+     * @return              true if one or more properties was bound
+     */
+    public static boolean bindProperties(CamelContext camelContext, Object 
target, Map<String, Object> properties,
+                                         boolean nesting, boolean deepNesting, 
boolean fluentBuilder, boolean reference, boolean placeholder) {
+
+        return bindProperties(camelContext, target, properties, null, nesting, 
deepNesting, fluentBuilder, reference, placeholder);
+    }
+
+    /**
+     * Binds the properties with the given prefix to the target object, and 
removes the property that was bound from properties.
+     * Note that the prefix is removed from the key before the property is 
bound.
      *
      * @param camelContext  the camel context
      * @param target        the target object
      * @param properties    the properties where the bound properties will be 
removed from
+     * @param optionPrefix  the prefix used to filter properties
      * @param nesting       whether nesting is in use
      * @param deepNesting   whether deep nesting is in use, where Camel will 
attempt to walk as deep as possible by creating new objects in the OGNL graph if
      *                      a property has a setter and the object can be 
created from a default no-arg constructor.
@@ -276,6 +321,7 @@ public final class PropertyBindingSupport {
      * @return              true if one or more properties was bound
      */
     public static boolean bindProperties(CamelContext camelContext, Object 
target, Map<String, Object> properties,
+                                         String optionPrefix,
                                          boolean nesting, boolean deepNesting, 
boolean fluentBuilder, boolean reference, boolean placeholder) {
         org.apache.camel.util.ObjectHelper.notNull(camelContext, 
"camelContext");
         org.apache.camel.util.ObjectHelper.notNull(target, "target");
@@ -287,9 +333,22 @@ public final class PropertyBindingSupport {
 
         for (Iterator<Map.Entry<String, Object>> iter = 
properties.entrySet().iterator(); iter.hasNext();) {
             Map.Entry<String, Object> entry = iter.next();
-            if (bindProperty(camelContext, target, entry.getKey(), 
entry.getValue(), nesting, deepNesting, fluentBuilder, reference, placeholder)) 
{
-                iter.remove();
-                rc = true;
+            String key = entry.getKey();
+            Object value = entry.getValue();
+
+            if (isNotEmpty(optionPrefix)) {
+                if (!key.startsWith(optionPrefix)) {
+                    continue;
+                }
+
+                key = key.substring(optionPrefix.length());
+            }
+
+            if (entry != null) {
+                if (bindProperty(camelContext, target, key, value, nesting, 
deepNesting, fluentBuilder, reference, placeholder)) {
+                    iter.remove();
+                    rc = true;
+                }
             }
         }
 

Reply via email to