You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ni...@apache.org on 2019/03/27 01:28:18 UTC
[camel] branch master updated: Added source code into
using-propertyplaceholder.adoc
This is an automated email from the ASF dual-hosted git repository.
ningjiang 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 7c882e0 Added source code into using-propertyplaceholder.adoc
7c882e0 is described below
commit 7c882e0bc938308f9f79753f422bc3305722d249
Author: Willem Jiang <ji...@huawei.com>
AuthorDate: Wed Mar 27 09:27:52 2019 +0800
Added source code into using-propertyplaceholder.adoc
---
.../ROOT/pages/using-propertyplaceholder.adoc | 199 +++++++++++++++++++--
1 file changed, 189 insertions(+), 10 deletions(-)
diff --git a/docs/user-manual/modules/ROOT/pages/using-propertyplaceholder.adoc b/docs/user-manual/modules/ROOT/pages/using-propertyplaceholder.adoc
index 6dc99a9..5741588 100644
--- a/docs/user-manual/modules/ROOT/pages/using-propertyplaceholder.adoc
+++ b/docs/user-manual/modules/ROOT/pages/using-propertyplaceholder.adoc
@@ -651,7 +651,31 @@ Each location is separated by comma.
When using Blueprint property placeholder in the Blueprint XML file, you
can declare the properties directly in the XML file as shown below:
-include::../../../components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/configadmin-outside.xml[]
+[source,xml]
+----
+<!-- blueprint property placeholders -->
+<cm:property-placeholder persistent-id="my-placeholders" update-strategy="reload">
+ <cm:default-properties>
+ <cm:property name="greeting" value="Hello"/>
+ <cm:property name="destination" value="mock:result"/>
+ </cm:default-properties>
+</cm:property-placeholder>
+
+<!-- a bean that uses a blueprint property placeholder -->
+<bean id="myCoolBean" class="org.apache.camel.test.blueprint.MyCoolBean">
+ <property name="say" value="${greeting}"/>
+</bean>
+
+<camelContext xmlns="http://camel.apache.org/schema/blueprint">
+
+ <route>
+ <from uri="direct:start"/>
+ <bean ref="myCoolBean" method="saySomething"/>
+ <to uri="{{destination}}"/>
+ </route>
+
+</camelContext>
+---
Notice that we have a `<bean>` which refers to one of the properties. And in
the Camel route we refer to the other using the `{{ }}` notation.
@@ -659,7 +683,16 @@ the Camel route we refer to the other using the `{{ }}` notation.
Now if you want to override these Blueprint properties from an unit
test, you can do this as shown below:
-include::../../../components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/ConfigAdminOverridePropertiesOutsideCamelContextTest.java[]
+[source,java]
+----
+protected String useOverridePropertiesWithConfigAdmin(Dictionary props) {
+ // add the properties we want to override
+ props.put("greeting", "Bye");
+
+ // return the PID of the config-admin we are using in the blueprint xml file
+ return "my-placeholders";
+}
+----
To do this we override and implement the
`useOverridePropertiesWithConfigAdmin` method. We can then put the
@@ -683,14 +716,47 @@ For example in the blueprint XML file we have the
`persistence-id="stuff"`, which mean it will load the configuration
file as `etc/stuff.cfg`.
-include::../../../components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/configadmin-loadfile.xml[]
+[source,xml]
+----
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
+ xsi:schemaLocation="
+ http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0 http://aries.apache.org/schemas/blueprint-cm/blueprint-cm-1.1.0.xsd
+ http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
+
+<!-- blueprint property placeholders, that will use etc/stuff.cfg as the properties file -->
+<cm:property-placeholder persistent-id="stuff" update-strategy="reload"/>
+
+<!-- a bean that uses a blueprint property placeholder -->
+<bean id="myCoolBean" class="org.apache.camel.test.blueprint.MyCoolBean">
+ <property name="say" value="${greeting}"/>
+</bean>
+
+<camelContext xmlns="http://camel.apache.org/schema/blueprint">
+
+ <route>
+ <from uri="direct:start"/>
+ <bean ref="myCoolBean" method="saySomething"/>
+ <to uri="mock:result"/>
+ </route>
+
+</camelContext>
+----
Now if you want to unit test this blueprint XML file, then you can override
the `loadConfigAdminConfigurationFile` and tell Camel which file to
load as shown below:
-include::../../../components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/ConfigAdminLoadConfigurationFileTest.java[]
-
+[source,java]
+----
+@Override
+protected String[] loadConfigAdminConfigurationFile() {
+ // String[0] = tell Camel the path of the .cfg file to use for OSGi ConfigAdmin in the blueprint XML file
+ // String[1] = tell Camel the persistence-id of the cm:property-placeholder in the blueprint XML file
+ return new String[]{"src/test/resources/etc/stuff.cfg", "stuff"};
+}
+----
Notice that this method requires to return a `String[]` with 2 values. The
1st value is the path for the configuration file to load. The second
value is the persistence-id of the `<cm:property-placeholder>` tag.
@@ -711,11 +777,92 @@ greeting=Bye
You can do both as well. Here is a complete example. First we have the
Blueprint XML file:
-include::../../../components/camel-test-blueprint/src/test/resources/org/apache/camel/test/blueprint/configadmin-loadfileoverride.xml[]
+[source,xml]
+----
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
+ xsi:schemaLocation="
+ http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0 http://aries.apache.org/schemas/blueprint-cm/blueprint-cm-1.1.0.xsd
+ http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
+
+ <!-- blueprint property placeholders, that will use etc/stuff.cfg as the properties file -->
+ <cm:property-placeholder persistent-id="stuff" update-strategy="reload">
+ <cm:default-properties>
+ <cm:property name="greeting" value="Hello" />
+ <cm:property name="echo" value="Hey" />
+ <cm:property name="destination" value="mock:original" />
+ </cm:default-properties>
+ </cm:property-placeholder>
+
+ <!-- a bean that uses a blueprint property placeholder -->
+ <bean id="myCoolBean" class="org.apache.camel.test.blueprint.MyCoolBean">
+ <property name="say" value="${greeting}"/>
+ <property name="echo" value="${echo}"/>
+ </bean>
+
+ <camelContext xmlns="http://camel.apache.org/schema/blueprint">
+
+ <route>
+ <from uri="direct:start"/>
+ <bean ref="myCoolBean" method="saySomething"/>
+ <to uri="{{destination}}"/>
+ <bean ref="myCoolBean" method="echoSomething"/>
+ <to uri="{{destination}}"/>
+ </route>
+
+ </camelContext>
+
+</blueprint>
+----
And in the unit test class we do as follows:
-include::../../../components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/ConfigAdminLoadConfigurationFileAndOverrideTest.java[]
+[source,java]
+----
+/**
+ * This example will load a Blueprint .cfg file (which will initialize configadmin), and also override its property
+ * placeholders from this unit test source code directly (the change will reload blueprint container).
+ */
+public class ConfigAdminLoadConfigurationFileAndOverrideTest extends CamelBlueprintTestSupport {
+
+ @Override
+ protected String getBlueprintDescriptor() {
+ // which blueprint XML file to use for this test
+ return "org/apache/camel/test/blueprint/configadmin-loadfileoverride.xml";
+ }
+
+ @Override
+ protected String[] loadConfigAdminConfigurationFile() {
+ // which .cfg file to use, and the name of the persistence-id
+ return new String[]{"src/test/resources/etc/stuff.cfg", "stuff"};
+ }
+
+ @Override
+ protected String useOverridePropertiesWithConfigAdmin(Dictionary props) throws Exception {
+ // override / add extra properties
+ props.put("destination", "mock:extra");
+
+ // return the persistence-id to use
+ return "stuff";
+ }
+
+ @Test
+ public void testConfigAdmin() throws Exception {
+ // mock:original comes from <cm:default-properties>/<cm:property name="destination" value="mock:original" />
+ getMockEndpoint("mock:original").setExpectedMessageCount(0);
+ // mock:result comes from loadConfigAdminConfigurationFile()
+ getMockEndpoint("mock:result").setExpectedMessageCount(0);
+ // mock:extra comes from useOverridePropertiesWithConfigAdmin()
+ getMockEndpoint("mock:extra").expectedBodiesReceived("Bye World", "Yay Bye WorldYay Bye World");
+
+ template.sendBody("direct:start", "World");
+
+ assertMockEndpointsSatisfied();
+ }
+
+}
+----
And the `etc/stuff.cfg` configuration file contains:
@@ -743,7 +890,14 @@ type.
To bridge Spring and Camel you must define a single bean as shown below:
-include::../../../components/camel-spring/src/test/resources/org/apache/camel/component/properties/CamelSpringPropertyPlaceholderConfigurerTest.xml[]
+[source,xml]
+----
+<!-- bridge spring property placeholder with Camel -->
+<!-- you must NOT use the <context:property-placeholder at the same time, only this bridge bean -->
+<bean id="bridgePropertyPlaceholder" class="org.apache.camel.spring.spi.BridgePropertyPlaceholderConfigurer">
+ <property name="location" value="classpath:org/apache/camel/component/properties/cheese.properties"/>
+</bean>
+----
You *must not* use the spring `<context:property-placeholder>` namespace
at the same time; this is not possible.
@@ -752,7 +906,23 @@ After declaring this bean, you can define property placeholders using
both the Spring style, and the Camel style within the `<camelContext>`
tag as shown below:
-include::../../../components/camel-spring/src/test/resources/org/apache/camel/component/properties/CamelSpringPropertyPlaceholderConfigurerTest.xml[]
+[source,xml]
+----
+<!-- a bean that uses Spring property placeholder -->
+<!-- the ${hi} is a spring property placeholder -->
+<bean id="hello" class="org.apache.camel.component.properties.HelloBean">
+ <property name="greeting" value="${hi}"/>
+</bean>
+
+<camelContext xmlns="http://camel.apache.org/schema/spring">
+ <!-- in this route we use Camels property placeholder {{ }} style -->
+ <route>
+ <from uri="direct:{{cool.bar}}"/>
+ <bean ref="hello"/>
+ <to uri="{{cool.end}}"/>
+ </route>
+</camelContext>
+----
Notice how the hello bean is using pure Spring property placeholders using
the `${}` notation. And in the Camel routes we use the Camel
@@ -808,7 +978,16 @@ So for example in your unit test classes, you can override the
`java.util.Properties` that contains the properties which should be
preferred to be used.
-include::../../../components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/ConfigAdminOverridePropertiesTest.java[]
+[source,java]
+----
+@Override
+protected Properties useOverridePropertiesWithPropertiesComponent() {
+ Properties extra = new Properties();
+ extra.put("destination", "mock:extra");
+ extra.put("greeting", "Bye");
+ return extra;
+}
+----
This can be done from any of the Camel Test kits, such as `camel-test`,
`camel-test-spring` and `camel-test-blueprint`.