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

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

commit 5aee47f84950b062e211990af1dd95a0149da297
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Wed Jul 3 13:07:27 2019 +0200

    CAMEL-13721: Properties component - Make it simpler by removing not often 
used stuff
---
 .../component/properties/PropertiesComponent.java  |   3 +
 .../PropertiesComponentGetOrElseTest.java          | 103 +++++
 .../properties/PropertiesComponentTest.java        | 498 +++++++++++++++++++++
 3 files changed, 604 insertions(+)

diff --git 
a/components/camel-properties/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
 
b/components/camel-properties/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
index e9a3638..299c1b7 100644
--- 
a/components/camel-properties/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
+++ 
b/components/camel-properties/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
@@ -551,6 +551,9 @@ public class PropertiesComponent extends DefaultComponent 
implements org.apache.
         } catch (Exception e) {
             LOG.debug("Error discovering and using custom PropertiesSource due 
to " + e.getMessage() + ". This exception is ignored", e);
         }
+
+        ServiceHelper.initService(locationSources);
+        ServiceHelper.initService(sources);
     }
 
     @Override
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentGetOrElseTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentGetOrElseTest.java
new file mode 100644
index 0000000..351a9b0
--- /dev/null
+++ 
b/core/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentGetOrElseTest.java
@@ -0,0 +1,103 @@
+/*
+ * 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.builder.RouteBuilder;
+import org.junit.Test;
+
+public class PropertiesComponentGetOrElseTest extends ContextTestSupport {
+
+    @Override
+    public boolean isUseRouteBuilder() {
+        return false;
+    }
+
+    @Test
+    public void testPropertiesComponentFoundKey() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").to("properties:{{cool.end:mock:wrong}}");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:result").expectedMessageCount(1);
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test
+    public void testPropertiesComponentUseDefaultValue() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").to("properties:{{unknown:mock:result}}");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:result").expectedMessageCount(1);
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test
+    public void testPropertiesComponentSimpleLanguage() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                        .transform().simple("Hi ${body} do you think 
${properties:cool.name} rocks?");
+            }
+        });
+        context.start();
+
+        String reply = template.requestBody("direct:start", "Claus", 
String.class);
+        assertEquals("Hi Claus do you think Camel rocks?", reply);
+    }
+
+    @Test
+    public void testPropertiesComponentSimpleLanguageUsingDefaultValue() 
throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                        .transform().simple("Hi ${body} do you think 
${properties:unknown:Beer} rocks?");
+            }
+        });
+        context.start();
+
+        String reply = template.requestBody("direct:start", "Claus", 
String.class);
+        assertEquals("Hi Claus do you think Beer rocks?", reply);
+    }
+
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+        context.addComponent("properties", new 
PropertiesComponent("classpath:org/apache/camel/component/properties/myproperties.properties"));
+        return context;
+    }
+
+}
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentTest.java
new file mode 100644
index 0000000..54d293f
--- /dev/null
+++ 
b/core/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentTest.java
@@ -0,0 +1,498 @@
+/*
+ * 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.ResolveEndpointFailedException;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.Test;
+
+public class PropertiesComponentTest extends ContextTestSupport {
+
+    @Override
+    public boolean isUseRouteBuilder() {
+        return false;
+    }
+
+    @Test
+    public void testPropertiesComponent() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").to("properties:{{cool.end}}");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:result").expectedMessageCount(1);
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test
+    public void testPropertiesComponentTwo() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").to("properties:{{cool.end}}");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:result").expectedMessageCount(2);
+
+        template.sendBody("direct:start", "Hello World");
+        template.sendBody("direct:start", "Bye World");
+
+        assertMockEndpointsSatisfied();
+    }
+    
+    @Test
+    public void testPropertiesComponentCustomTokens() throws Exception {
+        PropertiesComponent pc = context.getComponent("properties", 
PropertiesComponent.class);
+        pc.setPrefixToken("[[");
+        pc.setSuffixToken("]]");
+        
+        assertEquals("[[", pc.getPrefixToken());
+        assertEquals("]]", pc.getSuffixToken());
+        
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").to("properties:[[cool.end]]");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:result").expectedMessageCount(1);
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+        
+        pc.setPrefixToken(null);
+        pc.setSuffixToken(null);
+        
+        assertEquals(PropertiesComponent.DEFAULT_PREFIX_TOKEN, 
pc.getPrefixToken());
+        assertEquals(PropertiesComponent.DEFAULT_SUFFIX_TOKEN, 
pc.getSuffixToken());
+    }
+
+    @Test
+    public void testPropertiesComponentTemplate() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:cool").to("mock:result");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:result").expectedMessageCount(2);
+
+        template.sendBody("{{cool.start}}", "Hello World");
+        template.sendBody("{{cool.start}}", "Bye World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test
+    public void testPropertiesComponentResult() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").to("properties:mock:{{cool.result}}");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:result").expectedMessageCount(1);
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test
+    public void testPropertiesComponentMockMock() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                
from("direct:start").to("properties:{{cool.mock}}:{{cool.mock}}");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:mock").expectedMessageCount(1);
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test
+    public void testPropertiesComponentConcat() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").to("properties:cool.concat");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:result").expectedMessageCount(1);
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test
+    public void testPropertiesComponentInvalidKey() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").to("properties:{{foo.unknown}}");
+            }
+        });
+        try {
+            context.start();
+            fail("Should throw exception");
+        } catch (Exception e) {
+            ResolveEndpointFailedException cause = 
assertIsInstanceOf(ResolveEndpointFailedException.class, e.getCause());
+            IllegalArgumentException iae = 
assertIsInstanceOf(IllegalArgumentException.class, cause.getCause());
+            assertEquals("Property with key [foo.unknown] not found in 
properties from text: {{foo.unknown}}", iae.getMessage());
+        }
+    }
+
+    @Test
+    public void testPropertiesComponentCircularReference() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").to("properties:cool.a");
+            }
+        });
+        try {
+            context.start();
+            fail("Should throw exception");
+        } catch (Exception e) {
+            ResolveEndpointFailedException cause = 
assertIsInstanceOf(ResolveEndpointFailedException.class, e.getCause());
+            IllegalArgumentException iae = 
assertIsInstanceOf(IllegalArgumentException.class, cause.getCause());
+            assertEquals("Circular reference detected with key [cool.a] from 
text: {{cool.a}}", iae.getMessage());
+        }
+    }
+
+    @Test
+    public void testPropertiesComponentCacheDefault() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                // properties component can also have {{ }} around but its not 
needed
+                from("direct:start").to("properties:{{cool.end}}");
+                from("direct:foo").to("properties:mock:{{cool.result}}");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:result").expectedMessageCount(2);
+
+        template.sendBody("direct:start", "Hello World");
+        template.sendBody("direct:foo", "Hello Foo");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test
+    public void testPropertiesComponentCacheDisabled() throws Exception {
+        PropertiesComponent pc = context.getComponent("properties", 
PropertiesComponent.class);
+        pc.setCache(false);
+
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").to("properties:cool.end");
+                from("direct:foo").to("properties:mock:{{cool.result}}");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:result").expectedMessageCount(2);
+
+        template.sendBody("direct:start", "Hello World");
+        template.sendBody("direct:foo", "Hello Foo");
+
+        assertMockEndpointsSatisfied();
+    }
+    
+    @Test
+    public void testCache() throws Exception {
+        PropertiesComponent pc = context.getComponent("properties", 
PropertiesComponent.class);
+        assertTrue(pc.isCache());
+        assertNotNull(pc);
+
+        for (int i = 0; i < 2000; i++) {
+            String uri = pc.parseUri("{{cool.mock}}:" + i);
+            assertEquals("mock:" + i, uri);
+        }
+    }
+
+    @Test
+    public void testCacheRoute() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .setBody(simple("${properties:cool.mock}${body}"))
+                    .to("mock:result");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:result").expectedMessageCount(2000);
+
+        for (int i = 0; i < 2000; i++) {
+            template.sendBody("direct:start", i);
+        }
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test
+    public void testQuotedPrefix() throws Exception {
+        assertEquals("mock", 
context.resolvePropertyPlaceholders("{{cool.mock}}"));
+        assertEquals("'{{' + something + '}}'", 
context.resolvePropertyPlaceholders("'{{' + something + '}}'"));
+        assertEquals("\"{{\" + something + \"}}\"", 
context.resolvePropertyPlaceholders("\"{{\" + something + \"}}\""));
+        assertEquals("mock'", 
context.resolvePropertyPlaceholders("{{cool.mock}}'"));
+        assertEquals("mock\"", 
context.resolvePropertyPlaceholders("{{cool.mock}}\""));
+        assertEquals("'mock", 
context.resolvePropertyPlaceholders("'{{cool.mock}}"));
+        assertEquals("\"mock", 
context.resolvePropertyPlaceholders("\"{{cool.mock}}"));
+    }
+
+    @Test
+    public void testPropertiesComponentOverride() throws Exception {
+        System.setProperty("cool.result", "bar");
+        PropertiesComponent pc = context.getComponent("properties", 
PropertiesComponent.class);
+        
pc.setSystemPropertiesMode(PropertiesComponent.SYSTEM_PROPERTIES_MODE_OVERRIDE);
+
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:foo").to("mock:{{cool.result}}");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:result").expectedMessageCount(0);
+        getMockEndpoint("mock:bar").expectedMessageCount(1);
+
+        template.sendBody("direct:foo", "Hello Foo");
+
+        assertMockEndpointsSatisfied();
+
+        System.clearProperty("cool.result");
+    }
+
+    @Test
+    public void testPropertiesComponentFallback() throws Exception {
+        System.setProperty("cool.result", "bar");
+        System.setProperty("beer", "Carlsberg");
+        PropertiesComponent pc = context.getComponent("properties", 
PropertiesComponent.class);
+        
pc.setSystemPropertiesMode(PropertiesComponent.SYSTEM_PROPERTIES_MODE_FALLBACK);
+
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                
from("direct:foo").to("mock:{{beer}}").to("mock:{{cool.result}}");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:result").expectedMessageCount(1);
+        getMockEndpoint("mock:bar").expectedMessageCount(0);
+        getMockEndpoint("mock:Carlsberg").expectedMessageCount(1);
+
+        template.sendBody("direct:foo", "Hello Foo");
+
+        assertMockEndpointsSatisfied();
+
+        System.clearProperty("cool.result");
+        System.clearProperty("beer");
+    }
+
+    @Test
+    public void testPropertiesComponentNever() throws Exception {
+        System.setProperty("cool.result", "bar");
+        System.setProperty("beer", "Carlsberg");
+        PropertiesComponent pc = context.getComponent("properties", 
PropertiesComponent.class);
+        
pc.setSystemPropertiesMode(PropertiesComponent.SYSTEM_PROPERTIES_MODE_NEVER);
+
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                
from("direct:foo").to("mock:{{beer}}").to("mock:{{cool.result}}");
+            }
+        });
+        try {
+            context.start();
+            fail("Should have thrown exception");
+        } catch (Exception e) {
+            assertEquals("Property with key [beer] not found in properties 
from text: mock:{{beer}}", e.getCause().getMessage());
+        }
+
+        System.clearProperty("cool.result");
+        System.clearProperty("beer");
+    }
+
+    @Test
+    public void testPropertiesComponentEnvOverride() throws Exception {
+        PropertiesComponent pc = context.getComponent("properties", 
PropertiesComponent.class);
+        
pc.setEnvironmentVariableMode(PropertiesComponent.ENVIRONMENT_VARIABLES_MODE_OVERRIDE);
+        pc.setLocation("org/apache/camel/component/properties/env.properties");
+
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:foo").to("mock:{{FOO_SERVICE_HOST}}");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:hello").expectedMessageCount(0);
+        getMockEndpoint("mock:myserver").expectedMessageCount(1);
+
+        template.sendBody("direct:foo", "Hello Foo");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test
+    public void testPropertiesComponentEnvOverrideIfDash() throws Exception {
+        PropertiesComponent pc = context.getComponent("properties", 
PropertiesComponent.class);
+        
pc.setEnvironmentVariableMode(PropertiesComponent.ENVIRONMENT_VARIABLES_MODE_OVERRIDE);
+        pc.setLocation("org/apache/camel/component/properties/env.properties");
+
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                // will fallback and lookup as FOO_SERVICE_HOST
+                from("direct:foo").to("mock:{{FOO-SERVICE_host}}");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:hello").expectedMessageCount(0);
+        getMockEndpoint("mock:myserver").expectedMessageCount(1);
+
+        template.sendBody("direct:foo", "Hello Foo");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test
+    public void testPropertiesComponentEnvFallback() throws Exception {
+        PropertiesComponent pc = context.getComponent("properties", 
PropertiesComponent.class);
+        
pc.setEnvironmentVariableMode(PropertiesComponent.ENVIRONMENT_VARIABLES_MODE_FALLBACK);
+        pc.setLocation("org/apache/camel/component/properties/env.properties");
+
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:foo").to("mock:{{FOO_SERVICE_PORT}}");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:8081").expectedMessageCount(1);
+        getMockEndpoint("mock:hello").expectedMessageCount(0);
+        getMockEndpoint("mock:myserver").expectedMessageCount(0);
+
+        template.sendBody("direct:foo", "Hello Foo");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test
+    public void testPropertiesComponentEnvNever() throws Exception {
+        PropertiesComponent pc = context.getComponent("properties", 
PropertiesComponent.class);
+        
pc.setEnvironmentVariableMode(PropertiesComponent.ENVIRONMENT_VARIABLES_MODE_NEVER);
+        pc.setLocation("org/apache/camel/component/properties/env.properties");
+
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:foo").to("mock:{{UNKNOWN}}");
+            }
+        });
+        try {
+            context.start();
+            fail("Should have thrown exception");
+        } catch (Exception e) {
+            assertEquals("Property with key [UNKNOWN] not found in properties 
from text: mock:{{UNKNOWN}}", e.getCause().getMessage());
+        }
+    }
+
+    @Test
+    public void testPropertiesComponentEnvFallbackJvmOverride() throws 
Exception {
+        PropertiesComponent pc = context.getComponent("properties", 
PropertiesComponent.class);
+        
pc.setEnvironmentVariableMode(PropertiesComponent.ENVIRONMENT_VARIABLES_MODE_FALLBACK);
+        pc.setLocation("org/apache/camel/component/properties/env.properties");
+
+        // lets override the OS environment variable by setting a JVM system 
property
+        System.setProperty("FOO_SERVICE_PORT", "hello");
+
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:foo").to("mock:{{FOO_SERVICE_PORT}}");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:8081").expectedMessageCount(0);
+        getMockEndpoint("mock:hello").expectedMessageCount(1);
+        getMockEndpoint("mock:myserver").expectedMessageCount(0);
+
+        template.sendBody("direct:foo", "Hello Foo");
+
+        assertMockEndpointsSatisfied();
+
+        System.clearProperty("FOO_SERVICE_PORT");
+    }
+
+
+    @Test
+    public void testCamelProperties() throws Exception {
+        context.getGlobalOptions().put("foo", "Hello {{cool.name}}");
+        context.getGlobalOptions().put("bar", "cool.name");
+
+        context.start();
+
+        assertEquals("Hello Camel", context.getGlobalOptions().get("foo"));
+        assertEquals("cool.name", context.getGlobalOptions().get("bar"));
+    }
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+        context.addComponent("properties", new 
PropertiesComponent("classpath:org/apache/camel/component/properties/myproperties.properties"));
+        return context;
+    }
+
+}

Reply via email to