/** * 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.FailedToCreateRouteException; import org.apache.camel.ResolveEndpointFailedException; import org.apache.camel.builder.RouteBuilder; /** * @version */ public class PropertiesComponentTest extends ContextTestSupport { @Override public boolean isUseRouteBuilder() { return false; } 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(); } 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(); } 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()); } 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(); } 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(); } 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(); } 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(); } public void testPropertiesComponentLocationOverride() throws Exception { context.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("direct:start").to("properties:{{bar.end}}?locations=org/apache/camel/component/properties/bar.properties"); } }); context.start(); getMockEndpoint("mock:bar").expectedMessageCount(1); template.sendBody("direct:start", "Hello World"); assertMockEndpointsSatisfied(); } public void testPropertiesComponentLocationsOverride() throws Exception { context.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("direct:start").to("properties:bar.end?locations=org/apache/camel/component/properties/bar.properties"); from("direct:cheese").to("properties:cheese.end?locations=org/apache/camel/component/properties/bar.properties," + "classpath:org/apache/camel/component/properties/cheese.properties"); } }); context.start(); getMockEndpoint("mock:bar").expectedMessageCount(1); getMockEndpoint("mock:cheese").expectedMessageCount(1); template.sendBody("direct:start", "Hello World"); template.sendBody("direct:cheese", "Hello Cheese"); assertMockEndpointsSatisfied(); } 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 (FailedToCreateRouteException 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()); } } 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 (FailedToCreateRouteException 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()); } } 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(); } 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(); } public void testPropertiesComponentPropertyPrefix() throws Exception { PropertiesComponent pc = context.getComponent("properties", PropertiesComponent.class); pc.setPropertyPrefix("cool."); context.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("direct:start").to("properties:end"); from("direct:foo").to("properties:mock:{{result}}"); } }); context.start(); getMockEndpoint("mock:result").expectedMessageCount(2); template.sendBody("direct:start", "Hello World"); template.sendBody("direct:foo", "Hello Foo"); assertMockEndpointsSatisfied(); } public void testPropertiesComponentParameterizedPropertyPrefix() throws Exception { System.setProperty("myPrefix", "cool"); PropertiesComponent pc = context.getComponent("properties", PropertiesComponent.class); pc.setPropertyPrefix("${myPrefix}."); pc.setPropertySuffix(".xx"); context.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("direct:start").to("properties:end"); from("direct:foo").to("properties:mock:{{result}}"); } }); context.start(); getMockEndpoint("mock:result").expectedMessageCount(2); template.sendBody("direct:start", "Hello World"); template.sendBody("direct:foo", "Hello Foo"); assertMockEndpointsSatisfied(); System.clearProperty("myPrefix"); } public void testPropertiesComponentPropertyPrefixFallbackDefault() throws Exception { PropertiesComponent pc = context.getComponent("properties", PropertiesComponent.class); pc.setPropertyPrefix("cool."); context.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("direct:start").to("properties:cool.end"); from("direct:foo").to("properties:mock:{{result}}"); } }); context.start(); getMockEndpoint("mock:result").expectedMessageCount(2); template.sendBody("direct:start", "Hello World"); template.sendBody("direct:foo", "Hello Foo"); assertMockEndpointsSatisfied(); } public void testPropertiesComponentPropertyPrefixFallbackDefaultNotFound() throws Exception { PropertiesComponent pc = context.getComponent("properties", PropertiesComponent.class); pc.setPropertyPrefix("cool."); context.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("direct:start").to("properties:doesnotexist"); } }); try { context.start(); fail("Should throw exception"); } catch (FailedToCreateRouteException e) { ResolveEndpointFailedException cause = assertIsInstanceOf(ResolveEndpointFailedException.class, e.getCause()); IllegalArgumentException iae = assertIsInstanceOf(IllegalArgumentException.class, cause.getCause()); assertEquals("Property with key [cool.doesnotexist] (and original key [doesnotexist]) not found in properties from text: {{doesnotexist}}", iae.getMessage()); } } public void testPropertiesComponentPropertyPrefixFallbackFalse() throws Exception { PropertiesComponent pc = context.getComponent("properties", PropertiesComponent.class); pc.setPropertyPrefix("cool."); pc.setFallbackToUnaugmentedProperty(false); context.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("direct:start").to("properties:cool.end"); from("direct:foo").to("properties:mock:{{result}}"); } }); try { context.start(); fail("Should throw exception"); } catch (FailedToCreateRouteException e) { ResolveEndpointFailedException cause = assertIsInstanceOf(ResolveEndpointFailedException.class, e.getCause()); IllegalArgumentException iae = assertIsInstanceOf(IllegalArgumentException.class, cause.getCause()); assertEquals("Property with key [cool.cool.end] not found in properties from text: {{cool.end}}", iae.getMessage()); } } public void testPropertiesComponentPropertySuffix() throws Exception { PropertiesComponent pc = context.getComponent("properties", PropertiesComponent.class); pc.setPropertySuffix(".end"); context.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("direct:start").to("properties:cool"); } }); context.start(); getMockEndpoint("mock:result").expectedMessageCount(1); template.sendBody("direct:start", "Hello World"); assertMockEndpointsSatisfied(); } public void testPropertiesComponentPropertySuffixFallbackDefault() throws Exception { PropertiesComponent pc = context.getComponent("properties", PropertiesComponent.class); pc.setPropertySuffix(".end"); 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(); } public void testPropertiesComponentPropertySuffixFallbackFalse() throws Exception { PropertiesComponent pc = context.getComponent("properties", PropertiesComponent.class); pc.setPropertySuffix(".end"); pc.setFallbackToUnaugmentedProperty(false); context.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("direct:start").to("properties:cool.end"); } }); try { context.start(); fail("Should throw exception"); } catch (FailedToCreateRouteException e) { ResolveEndpointFailedException cause = assertIsInstanceOf(ResolveEndpointFailedException.class, e.getCause()); IllegalArgumentException iae = assertIsInstanceOf(IllegalArgumentException.class, cause.getCause()); assertEquals("Property with key [cool.end.end] not found in properties from text: {{cool.end}}", iae.getMessage()); } } public void testJvmSystemPropertyNotFound() throws Exception { try { context.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("direct:start").to("properties:xxx?locations=foo/${xxx}"); } }); context.start(); fail("Should thrown an exception"); } catch (FailedToCreateRouteException e) { IllegalArgumentException cause = assertIsInstanceOf(IllegalArgumentException.class, e.getCause().getCause()); assertEquals("Cannot find JVM system property with key: xxx", cause.getMessage()); } } 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); } } 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(); } 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}}")); } 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"); } 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"); } 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 (FailedToCreateRouteException e) { assertEquals("Property with key [beer] not found in properties from text: mock:{{beer}}", e.getCause().getMessage()); } System.clearProperty("cool.result"); System.clearProperty("beer"); } 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; } }