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 ddc95bbeaae CAMEL-19937: camel-core - Properties component - Add 
option to ignore unresolved property (#11622)
ddc95bbeaae is described below

commit ddc95bbeaae5633a7737db227ab2d4b4dec2a781
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Mon Oct 2 14:27:54 2023 +0200

    CAMEL-19937: camel-core - Properties component - Add option to ignore 
unresolved property (#11622)
---
 .../org/apache/camel/spi/PropertiesComponent.java  |  6 +++
 .../properties/PropertiesComponentConfigurer.java  |  6 +++
 .../properties/DefaultPropertiesParser.java        |  4 ++
 .../component/properties/PropertiesComponent.java  | 16 +++++-
 ...opertiesComponentIgnoreMissingPropertyTest.java | 59 ++++++++++++++++++++++
 5 files changed, 90 insertions(+), 1 deletion(-)

diff --git 
a/core/camel-api/src/main/java/org/apache/camel/spi/PropertiesComponent.java 
b/core/camel-api/src/main/java/org/apache/camel/spi/PropertiesComponent.java
index 0a201077fd1..00edeab3834 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/PropertiesComponent.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/PropertiesComponent.java
@@ -209,6 +209,12 @@ public interface PropertiesComponent extends StaticService 
{
      */
     void setIgnoreMissingLocation(boolean ignoreMissingLocation);
 
+    /**
+     * Whether to silently ignore if a property cannot be resolved (i.e. all 
properties is marked as optional), and
+     * return the value as-is.
+     */
+    void setIgnoreMissingProperty(boolean ignoreMissingProperty);
+
     /**
      * Whether to support nested property placeholders. A nested placeholder, 
means that a placeholder, has also a
      * placeholder, that should be resolved (recursively).
diff --git 
a/core/camel-base/src/generated/java/org/apache/camel/component/properties/PropertiesComponentConfigurer.java
 
b/core/camel-base/src/generated/java/org/apache/camel/component/properties/PropertiesComponentConfigurer.java
index a41836deb51..7aefabe7df8 100644
--- 
a/core/camel-base/src/generated/java/org/apache/camel/component/properties/PropertiesComponentConfigurer.java
+++ 
b/core/camel-base/src/generated/java/org/apache/camel/component/properties/PropertiesComponentConfigurer.java
@@ -33,6 +33,8 @@ public class PropertiesComponentConfigurer extends 
org.apache.camel.support.comp
         case "EnvironmentVariableMode": 
target.setEnvironmentVariableMode(property(camelContext, int.class, value)); 
return true;
         case "ignoremissinglocation":
         case "IgnoreMissingLocation": 
target.setIgnoreMissingLocation(property(camelContext, boolean.class, value)); 
return true;
+        case "ignoremissingproperty":
+        case "IgnoreMissingProperty": 
target.setIgnoreMissingProperty(property(camelContext, boolean.class, value)); 
return true;
         case "initialproperties":
         case "InitialProperties": 
target.setInitialProperties(property(camelContext, java.util.Properties.class, 
value)); return true;
         case "localproperties":
@@ -70,6 +72,8 @@ public class PropertiesComponentConfigurer extends 
org.apache.camel.support.comp
         case "EnvironmentVariableMode": return int.class;
         case "ignoremissinglocation":
         case "IgnoreMissingLocation": return boolean.class;
+        case "ignoremissingproperty":
+        case "IgnoreMissingProperty": return boolean.class;
         case "initialproperties":
         case "InitialProperties": return java.util.Properties.class;
         case "localproperties":
@@ -108,6 +112,8 @@ public class PropertiesComponentConfigurer extends 
org.apache.camel.support.comp
         case "EnvironmentVariableMode": return 
target.getEnvironmentVariableMode();
         case "ignoremissinglocation":
         case "IgnoreMissingLocation": return target.isIgnoreMissingLocation();
+        case "ignoremissingproperty":
+        case "IgnoreMissingProperty": return target.isIgnoreMissingProperty();
         case "initialproperties":
         case "InitialProperties": return target.getInitialProperties();
         case "localproperties":
diff --git 
a/core/camel-base/src/main/java/org/apache/camel/component/properties/DefaultPropertiesParser.java
 
b/core/camel-base/src/main/java/org/apache/camel/component/properties/DefaultPropertiesParser.java
index 112ce64678e..0053cc09de9 100644
--- 
a/core/camel-base/src/main/java/org/apache/camel/component/properties/DefaultPropertiesParser.java
+++ 
b/core/camel-base/src/main/java/org/apache/camel/component/properties/DefaultPropertiesParser.java
@@ -362,6 +362,10 @@ public class DefaultPropertiesParser implements 
PropertiesParser {
             }
 
             if (value == null) {
+                if (!optional && propertiesComponent != null && 
propertiesComponent.isIgnoreMissingProperty()) {
+                    // property is missing, but we should ignore this and 
return the placeholder unresolved
+                    return UNRESOLVED_PREFIX_TOKEN + key + 
UNRESOLVED_SUFFIX_TOKEN;
+                }
                 if (!optional) {
                     StringBuilder esb = new StringBuilder();
                     esb.append("Property with key [").append(key).append("] ");
diff --git 
a/core/camel-base/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
 
b/core/camel-base/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
index 0b470a51013..4a13c4e0e4a 100644
--- 
a/core/camel-base/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
+++ 
b/core/camel-base/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
@@ -114,6 +114,7 @@ public class PropertiesComponent extends ServiceSupport
     private List<PropertiesLocation> locations = new ArrayList<>();
     private String location;
     private boolean ignoreMissingLocation;
+    private boolean ignoreMissingProperty;
     private boolean nestedPlaceholder = true;
     private String encoding;
     private boolean defaultFallbackEnabled = true;
@@ -173,7 +174,11 @@ public class PropertiesComponent extends ServiceSupport
     @Override
     public Optional<String> resolveProperty(String key) {
         try {
-            String value = parseUri(key, propertiesLookup, false);
+            boolean keep = isIgnoreMissingProperty();
+            String value = parseUri(key, propertiesLookup, keep);
+            if (value == null) {
+                return Optional.empty();
+            }
             return Optional.of(value);
         } catch (IllegalArgumentException e) {
             // property not found
@@ -468,6 +473,15 @@ public class PropertiesComponent extends ServiceSupport
         this.ignoreMissingLocation = ignoreMissingLocation;
     }
 
+    @ManagedAttribute(description = "Ignore missing location")
+    public boolean isIgnoreMissingProperty() {
+        return ignoreMissingProperty;
+    }
+
+    public void setIgnoreMissingProperty(boolean ignoreMissingProperty) {
+        this.ignoreMissingProperty = ignoreMissingProperty;
+    }
+
     @ManagedAttribute(description = "Nested placeholder")
     public boolean isNestedPlaceholder() {
         return nestedPlaceholder;
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentIgnoreMissingPropertyTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentIgnoreMissingPropertyTest.java
new file mode 100644
index 00000000000..b2ed1928b44
--- /dev/null
+++ 
b/core/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentIgnoreMissingPropertyTest.java
@@ -0,0 +1,59 @@
+/*
+ * 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.properties;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.support.EndpointHelper;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class PropertiesComponentIgnoreMissingPropertyTest extends 
ContextTestSupport {
+
+    @Test
+    public void testIgnoreMissingProperty() throws Exception {
+        var o = context.getPropertiesComponent().resolveProperty("{{?foo}}");
+        Assertions.assertFalse(o.isEmpty());
+        Assertions.assertEquals("{{?foo}}", o.get());
+
+        o = context.getPropertiesComponent().resolveProperty("{{foo}}");
+        Assertions.assertFalse(o.isEmpty());
+        Assertions.assertEquals("{{foo}}", o.get());
+
+        o = 
context.getPropertiesComponent().resolveProperty("{{myQueueSize}}");
+        Assertions.assertFalse(o.isEmpty());
+        Assertions.assertEquals("10", o.get());
+
+        String out = 
EndpointHelper.resolveEndpointUriPropertyPlaceholders(context, "{{?foo}}");
+        Assertions.assertEquals("{{?foo}}", out);
+
+        out = EndpointHelper.resolveEndpointUriPropertyPlaceholders(context, 
"{{foo}}");
+        Assertions.assertEquals("{{foo}}", out);
+
+        out = EndpointHelper.resolveEndpointUriPropertyPlaceholders(context, 
"foo:dummy?a=1&b={{foo}}&c={{myQueueSize}}");
+        Assertions.assertEquals("foo:dummy?a=1&b={{foo}}&c=10", out);
+    }
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+        
context.getPropertiesComponent().setLocation("classpath:org/apache/camel/component/properties/myproperties.properties");
+        context.getPropertiesComponent().setIgnoreMissingProperty(true);
+        return context;
+    }
+
+}

Reply via email to