Author: davsclaus Date: Sat Feb 26 09:24:53 2011 New Revision: 1074807 URL: http://svn.apache.org/viewvc?rev=1074807&view=rev Log: CAMEL-3674: Added support for blueprint location to Camel properties component to bridge Blueprint and Camel. This allows you to use Blueprint placeholder in Camel routes.
Added: camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintPropertiesParser.java camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintPropertiesResolver.java camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/blueprint/BlueprintExplicitPropertiesRouteTest.java camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/blueprint/BlueprintPropertiesRouteTest.java camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/blueprint/blueprint-16.xml - copied, changed from r1074426, camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/blueprint/blueprint-15.xml camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/blueprint/blueprint-17.xml Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/properties/DefaultPropertiesParser.java camel/trunk/camel-core/src/main/java/org/apache/camel/component/properties/PropertiesParser.java camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java camel/trunk/components/camel-jasypt/src/main/java/org/apache/camel/component/jasypt/JasyptPropertiesParser.java camel/trunk/components/camel-jasypt/src/test/java/org/apache/camel/component/jasypt/JasyptPropertiesParserTest.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/properties/DefaultPropertiesParser.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/properties/DefaultPropertiesParser.java?rev=1074807&r1=1074806&r2=1074807&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/component/properties/DefaultPropertiesParser.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/properties/DefaultPropertiesParser.java Sat Feb 26 09:24:53 2011 @@ -57,7 +57,7 @@ public class DefaultPropertiesParser imp return answer; } - public String parsePropertyValue(String value) { + public String parseProperty(String key, String value, Properties properties) { return value; } @@ -94,21 +94,21 @@ public class DefaultPropertiesParser imp } private String createConstantPart(String uri, int start, int end) { - return parsePropertyValue(uri.substring(start, end)); + return uri.substring(start, end); } - private String createPlaceholderPart(String placeholderPart, Properties properties, List<String> replaced) { + private String createPlaceholderPart(String key, Properties properties, List<String> replaced) { // keep track of which parts we have replaced - replaced.add(placeholderPart); + replaced.add(key); - String propertyValue = System.getProperty(placeholderPart); + String propertyValue = System.getProperty(key); if (propertyValue != null) { - log.info("Found a JVM system property: " + placeholderPart + ". Overriding property set via Property Location"); - } else { - propertyValue = properties.getProperty(placeholderPart); + log.debug("Found a JVM system property: {} with value: {} to be used.", key, propertyValue); + } else if (properties != null) { + propertyValue = properties.getProperty(key); } - return parsePropertyValue(propertyValue); + return parseProperty(key, propertyValue, properties); } } Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/properties/PropertiesParser.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/properties/PropertiesParser.java?rev=1074807&r1=1074806&r2=1074807&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/component/properties/PropertiesParser.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/properties/PropertiesParser.java Sat Feb 26 09:24:53 2011 @@ -20,13 +20,11 @@ import java.util.Properties; /** * A parser to parse properties for a given input - * - * @version */ public interface PropertiesParser { /** - * Parses the string and replaces the property placeholders with values from the given properties + * Parses the string and replaces the property placeholders with values from the given properties. * * @param text the text to be parsed * @param properties the properties resolved which values should be looked up @@ -38,10 +36,15 @@ public interface PropertiesParser { String parseUri(String text, Properties properties, String prefixToken, String suffixToken) throws IllegalArgumentException; /** - * Parses the property value + * While parsing the uri using {@link #parseUri(String, java.util.Properties, String, String) parseUri} each + * parsed property found invokes this callback. + * <p/> + * This strategy method allows you to hook into the parsing and do custom lookup and return the actual value to use. * - * @param value the value - * @return the parsed value + * @param key the key + * @param value the value + * @param properties the properties resolved which values should be looked up + * @return the value to use */ - String parsePropertyValue(String value); + String parseProperty(String key, String value, Properties properties); } Added: camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintPropertiesParser.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintPropertiesParser.java?rev=1074807&view=auto ============================================================================== --- camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintPropertiesParser.java (added) +++ camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintPropertiesParser.java Sat Feb 26 09:24:53 2011 @@ -0,0 +1,126 @@ +/** + * 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.blueprint; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Properties; +import java.util.Set; + +import org.apache.aries.blueprint.ExtendedBeanMetadata; +import org.apache.aries.blueprint.ext.AbstractPropertyPlaceholder; +import org.apache.camel.component.properties.DefaultPropertiesParser; +import org.apache.camel.component.properties.PropertiesParser; +import org.apache.camel.util.ObjectHelper; +import org.osgi.service.blueprint.container.BlueprintContainer; +import org.osgi.service.blueprint.reflect.ComponentMetadata; + +/** + * Blueprint {@link PropertiesParser} which supports looking up + * property placeholders from the Blueprint Property Placeholder Service. + * <p/> + * This implementation will sit on top of any existing configured + * {@link PropertiesParser} and will delegate to those in case Blueprint could not + * resolve the property. + */ +public class BlueprintPropertiesParser extends DefaultPropertiesParser { + + private final BlueprintContainer container; + private PropertiesParser delegate; + private final Set<AbstractPropertyPlaceholder> placeholders = new LinkedHashSet<AbstractPropertyPlaceholder>(); + private Method method; + + public BlueprintPropertiesParser(BlueprintContainer container, PropertiesParser delegate) { + this.container = container; + this.delegate = delegate; + } + + /** + * Lookup the ids of the Blueprint property placeholder services in the + * Blueprint container. + * + * @return the ids, will be an empty array if none found. + */ + public String[] lookupPropertyPlaceholderIds() { + List<String> ids = new ArrayList<String>(); + + for (String id : container.getComponentIds()) { + ComponentMetadata meta = container.getComponentMetadata(id); + if (meta instanceof ExtendedBeanMetadata) { + Class clazz = ((ExtendedBeanMetadata) meta).getRuntimeClass(); + if (clazz != null && AbstractPropertyPlaceholder.class.isAssignableFrom(clazz)) { + ids.add(id); + } + } + } + + return ids.toArray(new String[ids.size()]); + } + + /** + * Adds the given Blueprint property placeholder service with the given id + * + * @param id id of the Blueprint property placeholder service to add. + */ + public void addPropertyPlaceholder(String id) { + Object component = container.getComponentInstance(id); + + if (component instanceof AbstractPropertyPlaceholder) { + AbstractPropertyPlaceholder placeholder = (AbstractPropertyPlaceholder) component; + placeholders.add(placeholder); + + log.debug("Adding Blueprint PropertyPlaceholder: {}", id); + + if (method == null) { + try { + method = AbstractPropertyPlaceholder.class.getDeclaredMethod("getProperty", String.class); + method.setAccessible(true); + } catch (NoSuchMethodException e) { + throw new IllegalStateException("Cannot add blueprint property placeholder: " + id + + " as the method getProperty is not accessible", e); + } + } + } + } + + @Override + public String parseProperty(String key, String value, Properties properties) { + log.trace("Parsing property key: {} with value: {}", key, value); + + // lookup key in blueprint and return its value + if (key != null) { + for (AbstractPropertyPlaceholder placeholder : placeholders) { + value = (String) ObjectHelper.invokeMethod(method, placeholder, key); + if (value != null) { + log.debug("Blueprint parsed property key: {} as value: {}", key, value); + break; + } + } + } + + if (value == null && delegate != null) { + // let delegate have a try since blueprint didn't resolve it + value = delegate.parseProperty(key, value, properties); + } + + log.trace("Returning parsed property key: {} as value: {}", key, value); + return value; + } + +} Added: camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintPropertiesResolver.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintPropertiesResolver.java?rev=1074807&view=auto ============================================================================== --- camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintPropertiesResolver.java (added) +++ camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/BlueprintPropertiesResolver.java Sat Feb 26 09:24:53 2011 @@ -0,0 +1,72 @@ +/** + * 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.blueprint; + +import java.util.Properties; + +import org.apache.camel.CamelContext; +import org.apache.camel.component.properties.PropertiesResolver; +import org.apache.camel.util.ObjectHelper; + +/** + * A {@link PropertiesResolver} which supports the <tt>blueprint</tt> scheme. + * <p/> + * This implementation will sit on top of any existing configured + * {@link org.apache.camel.component.properties.PropertiesResolver} and will delegate + * to any non <tt>blueprint</tt> schemes. + */ +public class BlueprintPropertiesResolver implements PropertiesResolver { + + private final PropertiesResolver delegate; + private final BlueprintPropertiesParser blueprint; + + public BlueprintPropertiesResolver(PropertiesResolver delegate, BlueprintPropertiesParser blueprint) { + this.delegate = delegate; + this.blueprint = blueprint; + } + + @Override + public Properties resolveProperties(CamelContext context, String... urls) throws Exception { + Properties answer = new Properties(); + + boolean explicit = false; + + for (String url : urls) { + if (url.startsWith("blueprint:")) { + String ref = ObjectHelper.after(url, "blueprint:"); + blueprint.addPropertyPlaceholder(ref); + // indicate an explicit blueprint id was configured + explicit = true; + } else { + // delegate the url + answer.putAll(delegate.resolveProperties(context, url)); + } + } + + if (!explicit) { + // auto lookup blueprint property placeholders to use if none explicit was configured + // this is convention over configuration + String[] ids = blueprint.lookupPropertyPlaceholderIds(); + for (String id : ids) { + blueprint.addPropertyPlaceholder(id); + } + } + + return answer; + } + +} Modified: camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java?rev=1074807&r1=1074806&r2=1074807&view=diff ============================================================================== --- camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java (original) +++ camel/trunk/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java Sat Feb 26 09:24:53 2011 @@ -19,7 +19,6 @@ package org.apache.camel.blueprint; import java.util.ArrayList; import java.util.Collection; import java.util.List; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; @@ -33,6 +32,7 @@ import org.apache.camel.RoutesBuilder; import org.apache.camel.ShutdownRoute; import org.apache.camel.ShutdownRunningTask; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.properties.PropertiesComponent; import org.apache.camel.core.osgi.OsgiCamelContextPublisher; import org.apache.camel.core.osgi.OsgiEventAdminNotifier; import org.apache.camel.core.osgi.utils.BundleDelegatingClassLoader; @@ -90,6 +90,8 @@ public class CamelContextFactoryBean ext @XmlAttribute(required = false) private String useMDCLogging; @XmlAttribute(required = false) + private Boolean useBlueprintPropertyResolver; + @XmlAttribute(required = false) private ShutdownRoute shutdownRoute; @XmlAttribute(required = false) private ShutdownRunningTask shutdownRunningTask; @@ -197,6 +199,37 @@ public class CamelContextFactoryBean ext } @Override + protected void initPropertyPlaceholder() throws Exception { + super.initPropertyPlaceholder(); + + // if blueprint property resolver is enabled on CamelContext then bridge PropertiesComponent to blueprint + if (isUseBlueprintPropertyResolver()) { + // lookup existing configured properties component + PropertiesComponent pc = getContext().getComponent("properties", PropertiesComponent.class); + + BlueprintPropertiesParser parser = new BlueprintPropertiesParser(blueprintContainer, pc.getPropertiesParser()); + BlueprintPropertiesResolver resolver = new BlueprintPropertiesResolver(pc.getPropertiesResolver(), parser); + + // no locations has been set, so its a default component + if (pc.getLocations() == null) { + StringBuilder sb = new StringBuilder(); + String[] ids = parser.lookupPropertyPlaceholderIds(); + for (String id : ids) { + sb.append("blueprint:").append(id).append(","); + } + // location supports multiple separated by comma + pc.setLocation(sb.toString()); + } + + if (pc.getLocations() != null) { + // bridge camel properties with blueprint + pc.setPropertiesParser(parser); + pc.setPropertiesResolver(resolver); + } + } + } + + @Override protected void initBeanPostProcessor(BlueprintCamelContext context) { } @@ -492,4 +525,17 @@ public class CamelContextFactoryBean ext implicitId = flag; } + public Boolean getUseBlueprintPropertyResolver() { + return useBlueprintPropertyResolver; + } + + public void setUseBlueprintPropertyResolver(Boolean useBlueprintPropertyResolver) { + this.useBlueprintPropertyResolver = useBlueprintPropertyResolver; + } + + public boolean isUseBlueprintPropertyResolver() { + // enable by default + return useBlueprintPropertyResolver == null || useBlueprintPropertyResolver.booleanValue(); + } + } Modified: camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java?rev=1074807&r1=1074806&r2=1074807&view=diff ============================================================================== --- camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java (original) +++ camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java Sat Feb 26 09:24:53 2011 @@ -317,7 +317,7 @@ public abstract class AbstractCamelConte protected abstract void initCustomRegistry(T context); - private void initJMXAgent() throws Exception { + protected void initJMXAgent() throws Exception { CamelJMXAgentDefinition camelJMXAgent = getCamelJMXAgent(); boolean disabled = false; @@ -358,7 +358,7 @@ public abstract class AbstractCamelConte } } - private void initPropertyPlaceholder() throws Exception { + protected void initPropertyPlaceholder() throws Exception { if (getCamelPropertyPlaceholder() != null) { CamelPropertyPlaceholderDefinition def = getCamelPropertyPlaceholder(); @@ -384,7 +384,7 @@ public abstract class AbstractCamelConte } } - private void initRouteRefs() throws Exception { + protected void initRouteRefs() throws Exception { // add route refs to existing routes if (getRouteRefs() != null) { for (RouteContextRefDefinition ref : getRouteRefs()) { @@ -519,7 +519,7 @@ public abstract class AbstractCamelConte } } - private void initThreadPoolProfiles(T context) { + protected void initThreadPoolProfiles(T context) { Set<String> defaultIds = new HashSet<String>(); // lookup and use custom profiles from the registry Modified: camel/trunk/components/camel-jasypt/src/main/java/org/apache/camel/component/jasypt/JasyptPropertiesParser.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jasypt/src/main/java/org/apache/camel/component/jasypt/JasyptPropertiesParser.java?rev=1074807&r1=1074806&r2=1074807&view=diff ============================================================================== --- camel/trunk/components/camel-jasypt/src/main/java/org/apache/camel/component/jasypt/JasyptPropertiesParser.java (original) +++ camel/trunk/components/camel-jasypt/src/main/java/org/apache/camel/component/jasypt/JasyptPropertiesParser.java Sat Feb 26 09:24:53 2011 @@ -16,6 +16,8 @@ */ package org.apache.camel.component.jasypt; +import java.util.Properties; + import org.apache.camel.component.properties.DefaultPropertiesParser; import org.apache.camel.util.ObjectHelper; import org.jasypt.encryption.pbe.StandardPBEStringEncryptor; @@ -33,7 +35,6 @@ public class JasyptPropertiesParser exte public static final String JASYPT_PREFIX_TOKEN = "ENC("; public static final String JASYPT_SUFFIX_TOKEN = ")"; - // TODO: A JasyptComponent we can leverage instead of directly from here private StandardPBEStringEncryptor encryptor; private String password; private String algorithm; @@ -76,7 +77,7 @@ public class JasyptPropertiesParser exte } @Override - public String parsePropertyValue(String value) { + public String parseProperty(String key, String value, Properties properties) { // check if the value is using the tokens String text = ObjectHelper.between(value, JASYPT_PREFIX_TOKEN, JASYPT_SUFFIX_TOKEN); if (text == null) { Modified: camel/trunk/components/camel-jasypt/src/test/java/org/apache/camel/component/jasypt/JasyptPropertiesParserTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jasypt/src/test/java/org/apache/camel/component/jasypt/JasyptPropertiesParserTest.java?rev=1074807&r1=1074806&r2=1074807&view=diff ============================================================================== --- camel/trunk/components/camel-jasypt/src/test/java/org/apache/camel/component/jasypt/JasyptPropertiesParserTest.java (original) +++ camel/trunk/components/camel-jasypt/src/test/java/org/apache/camel/component/jasypt/JasyptPropertiesParserTest.java Sat Feb 26 09:24:53 2011 @@ -27,8 +27,8 @@ public class JasyptPropertiesParserTest JasyptPropertiesParser parser = new JasyptPropertiesParser(); parser.setPassword("secret"); - assertEquals("foo", parser.parsePropertyValue("foo")); - assertEquals("tiger", parser.parsePropertyValue("ENC(bsW9uV37gQ0QHFu7KO03Ww==)")); + assertEquals("foo", parser.parseProperty(null, "foo", null)); + assertEquals("tiger", parser.parseProperty(null, "ENC(bsW9uV37gQ0QHFu7KO03Ww==)", null)); } public void testJasyptPropertiesParserSys() throws Exception { @@ -37,8 +37,8 @@ public class JasyptPropertiesParserTest JasyptPropertiesParser parser = new JasyptPropertiesParser(); parser.setPassword("sys:myfoo"); - assertEquals("foo", parser.parsePropertyValue("foo")); - assertEquals("tiger", parser.parsePropertyValue("ENC(bsW9uV37gQ0QHFu7KO03Ww==)")); + assertEquals("foo", parser.parseProperty(null, "foo", null)); + assertEquals("tiger", parser.parseProperty(null, "ENC(bsW9uV37gQ0QHFu7KO03Ww==)", null)); System.clearProperty("myfoo"); } Added: camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/blueprint/BlueprintExplicitPropertiesRouteTest.java URL: http://svn.apache.org/viewvc/camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/blueprint/BlueprintExplicitPropertiesRouteTest.java?rev=1074807&view=auto ============================================================================== --- camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/blueprint/BlueprintExplicitPropertiesRouteTest.java (added) +++ camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/blueprint/BlueprintExplicitPropertiesRouteTest.java Sat Feb 26 09:24:53 2011 @@ -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.itest.osgi.blueprint; + +import org.apache.camel.CamelContext; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.ops4j.pax.exam.Option; +import org.ops4j.pax.exam.junit.Configuration; +import org.ops4j.pax.exam.junit.JUnit4TestRunner; +import org.osgi.framework.Constants; + +import static org.ops4j.pax.exam.CoreOptions.felix; +import static org.ops4j.pax.exam.CoreOptions.options; +import static org.ops4j.pax.exam.CoreOptions.wrappedBundle; +import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.profile; +import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.scanFeatures; +import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.workingDirectory; +import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.newBundle; + +/** + * + */ +@RunWith(JUnit4TestRunner.class) +public class BlueprintExplicitPropertiesRouteTest extends OSGiBlueprintTestSupport { + + private String name = BlueprintExplicitPropertiesRouteTest.class.getName(); + + @Test + public void testBlueprintProperties() throws Exception { + // start bundle + getInstalledBundle(name).start(); + + // must use the camel context from osgi + CamelContext ctx = getOsgiService(CamelContext.class, "(camel.context.symbolicname=" + name + ")", 5000); + + ProducerTemplate myTemplate = ctx.createProducerTemplate(); + myTemplate.start(); + + // do our testing + MockEndpoint foo = ctx.getEndpoint("mock:foo", MockEndpoint.class); + foo.expectedMessageCount(1); + MockEndpoint result = ctx.getEndpoint("mock:result", MockEndpoint.class); + result.expectedMessageCount(1); + + myTemplate.sendBody("direct:start", "Hello World"); + + foo.assertIsSatisfied(); + result.assertIsSatisfied(); + + myTemplate.stop(); + } + + @Configuration + public static Option[] configure() throws Exception { + + Option[] options = options( + + bundle(newBundle() + .add("OSGI-INF/blueprint/test.xml", BlueprintExplicitPropertiesRouteTest.class.getResource("blueprint-16.xml")) + .set(Constants.BUNDLE_SYMBOLICNAME, BlueprintExplicitPropertiesRouteTest.class.getName()) + .build()).noStart(), + + // install the spring dm profile + profile("spring.dm").version("1.2.0"), + // this is how you set the default log level when using pax logging (logProfile) + // org.ops4j.pax.exam.CoreOptions.systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("TRACE"), + + // install blueprint requirements + mavenBundle("org.apache.felix", "org.apache.felix.configadmin"), + // install tiny bundles + mavenBundle("org.ops4j.base", "ops4j-base-store"), + wrappedBundle(mavenBundle("org.ops4j.pax.swissbox", "pax-swissbox-bnd")), + mavenBundle("org.ops4j.pax.swissbox", "pax-swissbox-tinybundles"), + + // using the features to install the camel components + scanFeatures(getCamelKarafFeatureUrl(), + "camel-core", "camel-blueprint", "camel-test"), + + workingDirectory("target/paxrunner/"), + + felix()/*, equinox()*/); + + return options; + } + +} Added: camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/blueprint/BlueprintPropertiesRouteTest.java URL: http://svn.apache.org/viewvc/camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/blueprint/BlueprintPropertiesRouteTest.java?rev=1074807&view=auto ============================================================================== --- camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/blueprint/BlueprintPropertiesRouteTest.java (added) +++ camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/blueprint/BlueprintPropertiesRouteTest.java Sat Feb 26 09:24:53 2011 @@ -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.itest.osgi.blueprint; + +import org.apache.camel.CamelContext; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.ops4j.pax.exam.Option; +import org.ops4j.pax.exam.junit.Configuration; +import org.ops4j.pax.exam.junit.JUnit4TestRunner; +import org.osgi.framework.Constants; + +import static org.ops4j.pax.exam.CoreOptions.felix; +import static org.ops4j.pax.exam.CoreOptions.options; +import static org.ops4j.pax.exam.CoreOptions.wrappedBundle; +import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.profile; +import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.scanFeatures; +import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.workingDirectory; +import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.newBundle; + +/** + * + */ +@RunWith(JUnit4TestRunner.class) +public class BlueprintPropertiesRouteTest extends OSGiBlueprintTestSupport { + + private String name = BlueprintPropertiesRouteTest.class.getName(); + + @Test + public void testBlueprintProperties() throws Exception { + // start bundle + getInstalledBundle(name).start(); + + // must use the camel context from osgi + CamelContext ctx = getOsgiService(CamelContext.class, "(camel.context.symbolicname=" + name + ")", 5000); + + ProducerTemplate myTemplate = ctx.createProducerTemplate(); + myTemplate.start(); + + // do our testing + MockEndpoint foo = ctx.getEndpoint("mock:foo", MockEndpoint.class); + foo.expectedMessageCount(1); + MockEndpoint result = ctx.getEndpoint("mock:result", MockEndpoint.class); + result.expectedMessageCount(1); + + myTemplate.sendBody("direct:start", "Hello World"); + + foo.assertIsSatisfied(); + result.assertIsSatisfied(); + + myTemplate.stop(); + } + + @Configuration + public static Option[] configure() throws Exception { + + Option[] options = options( + + bundle(newBundle() + .add("OSGI-INF/blueprint/test.xml", BlueprintPropertiesRouteTest.class.getResource("blueprint-17.xml")) + .set(Constants.BUNDLE_SYMBOLICNAME, BlueprintPropertiesRouteTest.class.getName()) + .build()).noStart(), + + // install the spring dm profile + profile("spring.dm").version("1.2.0"), + // this is how you set the default log level when using pax logging (logProfile) + // org.ops4j.pax.exam.CoreOptions.systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value("TRACE"), + + // install blueprint requirements + mavenBundle("org.apache.felix", "org.apache.felix.configadmin"), + // install tiny bundles + mavenBundle("org.ops4j.base", "ops4j-base-store"), + wrappedBundle(mavenBundle("org.ops4j.pax.swissbox", "pax-swissbox-bnd")), + mavenBundle("org.ops4j.pax.swissbox", "pax-swissbox-tinybundles"), + + // using the features to install the camel components + scanFeatures(getCamelKarafFeatureUrl(), + "camel-core", "camel-blueprint", "camel-test"), + + workingDirectory("target/paxrunner/"), + + felix()/*, equinox()*/); + + return options; + } + +} Copied: camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/blueprint/blueprint-16.xml (from r1074426, camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/blueprint/blueprint-15.xml) URL: http://svn.apache.org/viewvc/camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/blueprint/blueprint-16.xml?p2=camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/blueprint/blueprint-16.xml&p1=camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/blueprint/blueprint-15.xml&r1=1074426&r2=1074807&rev=1074807&view=diff ============================================================================== --- camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/blueprint/blueprint-15.xml (original) +++ camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/blueprint/blueprint-16.xml Sat Feb 26 09:24:53 2011 @@ -15,15 +15,34 @@ See the License for the specific language governing permissions and limitations under the License. --> -<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> +<!-- START SNIPPET: e1 --> +<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.0.0" + xsi:schemaLocation=" + http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"> + + <!-- OSGI blueprint property placeholder --> + <cm:property-placeholder id="myblueprint.placeholder" persistent-id="camel.blueprint"> + <!-- list some properties for this test --> + <cm:default-properties> + <cm:property name="result" value="mock:result"/> + </cm:default-properties> + </cm:property-placeholder> <camelContext xmlns="http://camel.apache.org/schema/blueprint"> + + <!-- using Camel properties component and refer to the blueprint property placeholder by its id --> + <propertyPlaceholder id="properties" location="blueprint:myblueprint.placeholder"/> + + <!-- in the route we can use {{ }} placeholders which will lookup in blueprint --> <route> - <from uri="mycomp:queue"/> - <to uri="mock:result"/> + <from uri="direct:start"/> + <to uri="mock:foo"/> + <to uri="{{result}}"/> </route> - </camelContext> - <bean id="mycomp" class="org.apache.camel.component.seda.SedaComponent"/> + </camelContext> </blueprint> +<!-- END SNIPPET: e1 --> Added: camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/blueprint/blueprint-17.xml URL: http://svn.apache.org/viewvc/camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/blueprint/blueprint-17.xml?rev=1074807&view=auto ============================================================================== --- camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/blueprint/blueprint-17.xml (added) +++ camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/blueprint/blueprint-17.xml Sat Feb 26 09:24:53 2011 @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + 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. +--> +<!-- START SNIPPET: e1 --> +<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.0.0" + xsi:schemaLocation=" + http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"> + + <!-- OSGI blueprint property placeholder --> + <cm:property-placeholder id="myblueprint.placeholder" persistent-id="camel.blueprint"> + <!-- list some properties for this test --> + <cm:default-properties> + <cm:property name="result" value="mock:result"/> + </cm:default-properties> + </cm:property-placeholder> + + <camelContext xmlns="http://camel.apache.org/schema/blueprint"> + + <!-- in the route we can use {{ }} placeholders which will lookup in blueprint + as Camel will auto detect the OSGi blueprint property placeholder and use it --> + <route> + <from uri="direct:start"/> + <to uri="mock:foo"/> + <to uri="{{result}}"/> + </route> + + </camelContext> + +</blueprint> +<!-- END SNIPPET: e1 -->