You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2014/12/03 11:37:06 UTC

[1/2] camel git commit: CAMEL-8115: Properties component - Include default functions to lookup from ENV / SYS etc

Repository: camel
Updated Branches:
  refs/heads/camel-2.14.x 48a75fa38 -> c17ba8b43
  refs/heads/master e9855f100 -> 2933522be


CAMEL-8115: Properties component - Include default functions to lookup from ENV / SYS etc


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/2933522b
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/2933522b
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/2933522b

Branch: refs/heads/master
Commit: 2933522be2ca3e05e126c2461a7fcbe28f9f6add
Parents: e9855f1
Author: Claus Ibsen <da...@apache.org>
Authored: Wed Dec 3 10:01:23 2014 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Wed Dec 3 10:01:23 2014 +0100

----------------------------------------------------------------------
 camel-core/pom.xml                              |  5 ++
 .../properties/EnvPropertiesFunction.java       | 46 ++++++++++++
 .../properties/PropertiesComponent.java         |  5 ++
 .../properties/ServicePropertiesFunction.java   | 68 +++++++++++++++++
 .../properties/SysPropertiesFunction.java       | 46 ++++++++++++
 ...PropertiesComponentDefaultFunctionsTest.java | 78 ++++++++++++++++++++
 .../PropertiesComponentServiceTest.java         | 70 ++++++++++++++++++
 7 files changed, 318 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/2933522b/camel-core/pom.xml
----------------------------------------------------------------------
diff --git a/camel-core/pom.xml b/camel-core/pom.xml
index aaea6a7..b6328e0 100644
--- a/camel-core/pom.xml
+++ b/camel-core/pom.xml
@@ -264,6 +264,11 @@
             <exclude>${platform.skip.tests}</exclude>
           </excludes>
           <forkedProcessTimeoutInSeconds>3000</forkedProcessTimeoutInSeconds>
+          <!-- needed for testing the properties component -->
+          <environmentVariables>
+            <FOO_SERVICE_HOST>myserver</FOO_SERVICE_HOST>
+            <FOO_SERVICE_PORT>8081</FOO_SERVICE_PORT>
+          </environmentVariables>
         </configuration>
       </plugin>
 

http://git-wip-us.apache.org/repos/asf/camel/blob/2933522b/camel-core/src/main/java/org/apache/camel/component/properties/EnvPropertiesFunction.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/properties/EnvPropertiesFunction.java b/camel-core/src/main/java/org/apache/camel/component/properties/EnvPropertiesFunction.java
new file mode 100644
index 0000000..5111ceb
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/component/properties/EnvPropertiesFunction.java
@@ -0,0 +1,46 @@
+/**
+ * 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.util.ObjectHelper;
+
+/**
+ * A {@link org.apache.camel.component.properties.PropertiesFunction} that lookup the property value from
+ * OS environment variables.
+ */
+public class EnvPropertiesFunction implements PropertiesFunction {
+
+    @Override
+    public String getName() {
+        return "env";
+    }
+
+    @Override
+    public String apply(String remainder) {
+        String key = remainder;
+        String defaultValue = null;
+
+        if (remainder.contains(":")) {
+            key = ObjectHelper.before(remainder, ":");
+            defaultValue = ObjectHelper.after(remainder, ":");
+        }
+
+        String value = System.getenv(key);
+        return value != null ? value : defaultValue;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/2933522b/camel-core/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java b/camel-core/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
index 247c357..0c2f05f 100644
--- a/camel-core/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
+++ b/camel-core/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
@@ -346,6 +346,11 @@ public class PropertiesComponent extends DefaultComponent {
         if (propertiesParser instanceof DefaultPropertiesParser) {
             ((DefaultPropertiesParser) propertiesParser).setPropertiesComponent(this);
         }
+
+        // include out of the box functions
+        addFunction(new EnvPropertiesFunction());
+        addFunction(new SysPropertiesFunction());
+        addFunction(new ServicePropertiesFunction());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/camel/blob/2933522b/camel-core/src/main/java/org/apache/camel/component/properties/ServicePropertiesFunction.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/properties/ServicePropertiesFunction.java b/camel-core/src/main/java/org/apache/camel/component/properties/ServicePropertiesFunction.java
new file mode 100644
index 0000000..5acf7ea
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/component/properties/ServicePropertiesFunction.java
@@ -0,0 +1,68 @@
+/**
+ * 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 java.util.Locale;
+
+import org.apache.camel.util.ObjectHelper;
+
+/**
+ * A {@link org.apache.camel.component.properties.PropertiesFunction} that lookup the property value from
+ * OS environment variables using the service idiom.
+ * <p/>
+ * A service is defined using two environment variables where name is name of the service:
+ * <ul>
+ *   <li><tt>NAME_SERVICE_HOST</tt></li>
+ *   <li><tt>NAME_SERVICE_PORT</tt></li>
+ * </ul>
+ * in other words the service uses <tt>_SERVICE_HOST</tt> and <tt>_SERVICE_PORT</tt> as prefix.
+ */
+public class ServicePropertiesFunction implements PropertiesFunction {
+
+    private static final String HOST_PREFIX = "_SERVICE_HOST";
+    private static final String PORT_PREFIX = "_SERVICE_PORT";
+
+    @Override
+    public String getName() {
+        return "service";
+    }
+
+    @Override
+    public String apply(String remainder) {
+        String key = remainder;
+        String defaultValue = null;
+
+        if (remainder.contains(":")) {
+            key = ObjectHelper.before(remainder, ":");
+            defaultValue = ObjectHelper.after(remainder, ":");
+        }
+
+        // make sure to use upper case
+        key = key.toUpperCase(Locale.US);
+
+        // a service should have both the host and port defined
+        String host = System.getenv(key + HOST_PREFIX);
+        String port = System.getenv(key + PORT_PREFIX);
+
+        if (host != null && port != null) {
+            return host + ":" + port;
+        } else {
+            return defaultValue;
+        }
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/camel/blob/2933522b/camel-core/src/main/java/org/apache/camel/component/properties/SysPropertiesFunction.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/properties/SysPropertiesFunction.java b/camel-core/src/main/java/org/apache/camel/component/properties/SysPropertiesFunction.java
new file mode 100644
index 0000000..7a91890
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/component/properties/SysPropertiesFunction.java
@@ -0,0 +1,46 @@
+/**
+ * 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.util.ObjectHelper;
+
+/**
+ * A {@link PropertiesFunction} that lookup the property value from
+ * JVM system property.
+ */
+public class SysPropertiesFunction implements PropertiesFunction {
+
+    @Override
+    public String getName() {
+        return "sys";
+    }
+
+    @Override
+    public String apply(String remainder) {
+        String key = remainder;
+        String defaultValue = null;
+
+        if (remainder.contains(":")) {
+            key = ObjectHelper.before(remainder, ":");
+            defaultValue = ObjectHelper.after(remainder, ":");
+        }
+
+        String value = System.getProperty(key);
+        return value != null ? value : defaultValue;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/2933522b/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentDefaultFunctionsTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentDefaultFunctionsTest.java b/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentDefaultFunctionsTest.java
new file mode 100644
index 0000000..6328c0e
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentDefaultFunctionsTest.java
@@ -0,0 +1,78 @@
+/**
+ * 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.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+
+public class PropertiesComponentDefaultFunctionsTest extends ContextTestSupport {
+
+    @Override
+    public boolean isUseRouteBuilder() {
+        return false;
+    }
+
+    public void testFunction() throws Exception {
+        System.setProperty("FOO", "mock:foo");
+
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                        .to("{{sys:FOO}}")
+                        .transform().constant("{{env:JAVA_HOME}}")
+                        .to("mock:bar");
+            }
+        });
+        context.start();
+
+        String body = System.getenv("JAVA_HOME");
+
+        getMockEndpoint("mock:foo").expectedBodiesReceived("Hello World");
+        getMockEndpoint("mock:bar").expectedBodiesReceived(body);
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+
+        System.getProperties().remove("FOO");
+    }
+
+    public void testFunctionGetOrElse() throws Exception {
+        System.setProperty("FOO2", "mock:foo");
+
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                        .to("{{sys:FOO2}}")
+                        .to("{{env:BAR2:mock:bar}}");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:foo").expectedMessageCount(1);
+        getMockEndpoint("mock:bar").expectedMessageCount(1);
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+
+        System.getProperties().remove("FOO2");
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/2933522b/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentServiceTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentServiceTest.java b/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentServiceTest.java
new file mode 100644
index 0000000..165b27f
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentServiceTest.java
@@ -0,0 +1,70 @@
+/**
+ * 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.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+
+public class PropertiesComponentServiceTest extends ContextTestSupport {
+
+    @Override
+    public boolean isUseRouteBuilder() {
+        return false;
+    }
+
+    public void testFunction() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                        .to("mock:foo")
+                        .transform().constant("{{service:FOO}}")
+                        .to("mock:bar");
+            }
+        });
+        context.start();
+
+        String body = System.getenv("FOO_SERVICE_HOST") + ":" + System.getenv("FOO_SERVICE_PORT");
+        getMockEndpoint("mock:foo").expectedBodiesReceived("Hello World");
+        getMockEndpoint("mock:bar").expectedBodiesReceived(body);
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testFunctionGetOrElse() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                        .to("mock:foo")
+                        .transform().constant("{{service:BAR:myotherserver:8888}}")
+                        .to("mock:bar");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:foo").expectedBodiesReceived("Hello World");
+        getMockEndpoint("mock:bar").expectedBodiesReceived("myotherserver:8888");
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+}


[2/2] camel git commit: CAMEL-8115: Properties component - Include default functions to lookup from ENV / SYS etc

Posted by da...@apache.org.
CAMEL-8115: Properties component - Include default functions to lookup from ENV / SYS etc


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/c17ba8b4
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/c17ba8b4
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/c17ba8b4

Branch: refs/heads/camel-2.14.x
Commit: c17ba8b4375a74ff932bd222a76e03fabc022792
Parents: 48a75fa
Author: Claus Ibsen <da...@apache.org>
Authored: Wed Dec 3 10:01:23 2014 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Wed Dec 3 11:36:54 2014 +0100

----------------------------------------------------------------------
 camel-core/pom.xml                              |  5 ++
 .../properties/EnvPropertiesFunction.java       | 46 ++++++++++++
 .../properties/PropertiesComponent.java         |  5 ++
 .../properties/ServicePropertiesFunction.java   | 68 +++++++++++++++++
 .../properties/SysPropertiesFunction.java       | 46 ++++++++++++
 ...PropertiesComponentDefaultFunctionsTest.java | 78 ++++++++++++++++++++
 .../PropertiesComponentServiceTest.java         | 70 ++++++++++++++++++
 7 files changed, 318 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/c17ba8b4/camel-core/pom.xml
----------------------------------------------------------------------
diff --git a/camel-core/pom.xml b/camel-core/pom.xml
index e20755b..4a52203 100644
--- a/camel-core/pom.xml
+++ b/camel-core/pom.xml
@@ -264,6 +264,11 @@
             <exclude>${platform.skip.tests}</exclude>
           </excludes>
           <forkedProcessTimeoutInSeconds>3000</forkedProcessTimeoutInSeconds>
+          <!-- needed for testing the properties component -->
+          <environmentVariables>
+            <FOO_SERVICE_HOST>myserver</FOO_SERVICE_HOST>
+            <FOO_SERVICE_PORT>8081</FOO_SERVICE_PORT>
+          </environmentVariables>
         </configuration>
       </plugin>
 

http://git-wip-us.apache.org/repos/asf/camel/blob/c17ba8b4/camel-core/src/main/java/org/apache/camel/component/properties/EnvPropertiesFunction.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/properties/EnvPropertiesFunction.java b/camel-core/src/main/java/org/apache/camel/component/properties/EnvPropertiesFunction.java
new file mode 100644
index 0000000..5111ceb
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/component/properties/EnvPropertiesFunction.java
@@ -0,0 +1,46 @@
+/**
+ * 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.util.ObjectHelper;
+
+/**
+ * A {@link org.apache.camel.component.properties.PropertiesFunction} that lookup the property value from
+ * OS environment variables.
+ */
+public class EnvPropertiesFunction implements PropertiesFunction {
+
+    @Override
+    public String getName() {
+        return "env";
+    }
+
+    @Override
+    public String apply(String remainder) {
+        String key = remainder;
+        String defaultValue = null;
+
+        if (remainder.contains(":")) {
+            key = ObjectHelper.before(remainder, ":");
+            defaultValue = ObjectHelper.after(remainder, ":");
+        }
+
+        String value = System.getenv(key);
+        return value != null ? value : defaultValue;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/c17ba8b4/camel-core/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java b/camel-core/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
index 247c357..0c2f05f 100644
--- a/camel-core/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
+++ b/camel-core/src/main/java/org/apache/camel/component/properties/PropertiesComponent.java
@@ -346,6 +346,11 @@ public class PropertiesComponent extends DefaultComponent {
         if (propertiesParser instanceof DefaultPropertiesParser) {
             ((DefaultPropertiesParser) propertiesParser).setPropertiesComponent(this);
         }
+
+        // include out of the box functions
+        addFunction(new EnvPropertiesFunction());
+        addFunction(new SysPropertiesFunction());
+        addFunction(new ServicePropertiesFunction());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/camel/blob/c17ba8b4/camel-core/src/main/java/org/apache/camel/component/properties/ServicePropertiesFunction.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/properties/ServicePropertiesFunction.java b/camel-core/src/main/java/org/apache/camel/component/properties/ServicePropertiesFunction.java
new file mode 100644
index 0000000..5acf7ea
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/component/properties/ServicePropertiesFunction.java
@@ -0,0 +1,68 @@
+/**
+ * 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 java.util.Locale;
+
+import org.apache.camel.util.ObjectHelper;
+
+/**
+ * A {@link org.apache.camel.component.properties.PropertiesFunction} that lookup the property value from
+ * OS environment variables using the service idiom.
+ * <p/>
+ * A service is defined using two environment variables where name is name of the service:
+ * <ul>
+ *   <li><tt>NAME_SERVICE_HOST</tt></li>
+ *   <li><tt>NAME_SERVICE_PORT</tt></li>
+ * </ul>
+ * in other words the service uses <tt>_SERVICE_HOST</tt> and <tt>_SERVICE_PORT</tt> as prefix.
+ */
+public class ServicePropertiesFunction implements PropertiesFunction {
+
+    private static final String HOST_PREFIX = "_SERVICE_HOST";
+    private static final String PORT_PREFIX = "_SERVICE_PORT";
+
+    @Override
+    public String getName() {
+        return "service";
+    }
+
+    @Override
+    public String apply(String remainder) {
+        String key = remainder;
+        String defaultValue = null;
+
+        if (remainder.contains(":")) {
+            key = ObjectHelper.before(remainder, ":");
+            defaultValue = ObjectHelper.after(remainder, ":");
+        }
+
+        // make sure to use upper case
+        key = key.toUpperCase(Locale.US);
+
+        // a service should have both the host and port defined
+        String host = System.getenv(key + HOST_PREFIX);
+        String port = System.getenv(key + PORT_PREFIX);
+
+        if (host != null && port != null) {
+            return host + ":" + port;
+        } else {
+            return defaultValue;
+        }
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/camel/blob/c17ba8b4/camel-core/src/main/java/org/apache/camel/component/properties/SysPropertiesFunction.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/properties/SysPropertiesFunction.java b/camel-core/src/main/java/org/apache/camel/component/properties/SysPropertiesFunction.java
new file mode 100644
index 0000000..7a91890
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/component/properties/SysPropertiesFunction.java
@@ -0,0 +1,46 @@
+/**
+ * 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.util.ObjectHelper;
+
+/**
+ * A {@link PropertiesFunction} that lookup the property value from
+ * JVM system property.
+ */
+public class SysPropertiesFunction implements PropertiesFunction {
+
+    @Override
+    public String getName() {
+        return "sys";
+    }
+
+    @Override
+    public String apply(String remainder) {
+        String key = remainder;
+        String defaultValue = null;
+
+        if (remainder.contains(":")) {
+            key = ObjectHelper.before(remainder, ":");
+            defaultValue = ObjectHelper.after(remainder, ":");
+        }
+
+        String value = System.getProperty(key);
+        return value != null ? value : defaultValue;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/c17ba8b4/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentDefaultFunctionsTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentDefaultFunctionsTest.java b/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentDefaultFunctionsTest.java
new file mode 100644
index 0000000..6328c0e
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentDefaultFunctionsTest.java
@@ -0,0 +1,78 @@
+/**
+ * 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.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+
+public class PropertiesComponentDefaultFunctionsTest extends ContextTestSupport {
+
+    @Override
+    public boolean isUseRouteBuilder() {
+        return false;
+    }
+
+    public void testFunction() throws Exception {
+        System.setProperty("FOO", "mock:foo");
+
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                        .to("{{sys:FOO}}")
+                        .transform().constant("{{env:JAVA_HOME}}")
+                        .to("mock:bar");
+            }
+        });
+        context.start();
+
+        String body = System.getenv("JAVA_HOME");
+
+        getMockEndpoint("mock:foo").expectedBodiesReceived("Hello World");
+        getMockEndpoint("mock:bar").expectedBodiesReceived(body);
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+
+        System.getProperties().remove("FOO");
+    }
+
+    public void testFunctionGetOrElse() throws Exception {
+        System.setProperty("FOO2", "mock:foo");
+
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                        .to("{{sys:FOO2}}")
+                        .to("{{env:BAR2:mock:bar}}");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:foo").expectedMessageCount(1);
+        getMockEndpoint("mock:bar").expectedMessageCount(1);
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+
+        System.getProperties().remove("FOO2");
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/c17ba8b4/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentServiceTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentServiceTest.java b/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentServiceTest.java
new file mode 100644
index 0000000..165b27f
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentServiceTest.java
@@ -0,0 +1,70 @@
+/**
+ * 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.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+
+public class PropertiesComponentServiceTest extends ContextTestSupport {
+
+    @Override
+    public boolean isUseRouteBuilder() {
+        return false;
+    }
+
+    public void testFunction() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                        .to("mock:foo")
+                        .transform().constant("{{service:FOO}}")
+                        .to("mock:bar");
+            }
+        });
+        context.start();
+
+        String body = System.getenv("FOO_SERVICE_HOST") + ":" + System.getenv("FOO_SERVICE_PORT");
+        getMockEndpoint("mock:foo").expectedBodiesReceived("Hello World");
+        getMockEndpoint("mock:bar").expectedBodiesReceived(body);
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testFunctionGetOrElse() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                        .to("mock:foo")
+                        .transform().constant("{{service:BAR:myotherserver:8888}}")
+                        .to("mock:bar");
+            }
+        });
+        context.start();
+
+        getMockEndpoint("mock:foo").expectedBodiesReceived("Hello World");
+        getMockEndpoint("mock:bar").expectedBodiesReceived("myotherserver:8888");
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+}