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 2013/04/03 15:16:48 UTC

svn commit: r1463994 - in /camel/branches/camel-2.10.x: ./ components/camel-spring/src/main/java/org/apache/camel/spring/ components/camel-spring/src/main/java/org/apache/camel/spring/spi/ components/camel-spring/src/test/java/org/apache/camel/componen...

Author: davsclaus
Date: Wed Apr  3 13:16:48 2013
New Revision: 1463994

URL: http://svn.apache.org/r1463994
Log:
CAMEL-6233: BridgePropertyPlaceholderConfigurer does not support nested Spring properties

Added:
    camel/branches/camel-2.10.x/components/camel-spring/src/test/java/org/apache/camel/component/properties/CamelSpringPropertyPlaceholderConfigurerNestedTest.java
      - copied unchanged from r1463987, camel/trunk/components/camel-spring/src/test/java/org/apache/camel/component/properties/CamelSpringPropertyPlaceholderConfigurerNestedTest.java
    camel/branches/camel-2.10.x/components/camel-spring/src/test/resources/org/apache/camel/component/properties/CamelSpringPropertyPlaceholderConfigurerNestedTest.xml
      - copied unchanged from r1463987, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/CamelSpringPropertyPlaceholderConfigurerNestedTest.xml
    camel/branches/camel-2.10.x/components/camel-spring/src/test/resources/org/apache/camel/component/properties/nested.properties
      - copied unchanged from r1463987, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/nested.properties
Modified:
    camel/branches/camel-2.10.x/   (props changed)
    camel/branches/camel-2.10.x/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
    camel/branches/camel-2.10.x/components/camel-spring/src/main/java/org/apache/camel/spring/spi/BridgePropertyPlaceholderConfigurer.java

Propchange: camel/branches/camel-2.10.x/
------------------------------------------------------------------------------
  Merged /camel/trunk:r1463987

Propchange: camel/branches/camel-2.10.x/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.

Modified: camel/branches/camel-2.10.x/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
URL: http://svn.apache.org/viewvc/camel/branches/camel-2.10.x/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java?rev=1463994&r1=1463993&r2=1463994&view=diff
==============================================================================
--- camel/branches/camel-2.10.x/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java (original)
+++ camel/branches/camel-2.10.x/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java Wed Apr  3 13:16:48 2013
@@ -250,8 +250,11 @@ public class CamelContextFactoryBean ext
             PropertiesComponent pc = getContext().getComponent("properties", PropertiesComponent.class);
             // replace existing resolver with us
             configurer.setResolver(pc.getPropertiesResolver());
+            configurer.setParser(pc.getPropertiesParser());
             String ref = "ref:" + id;
+            // use the bridge to handle the resolve and parsing
             pc.setPropertiesResolver(configurer);
+            pc.setPropertiesParser(configurer);
             // and update locations to have our as ref first
             String[] locations = pc.getLocations();
             String[] updatedLocations;

Modified: camel/branches/camel-2.10.x/components/camel-spring/src/main/java/org/apache/camel/spring/spi/BridgePropertyPlaceholderConfigurer.java
URL: http://svn.apache.org/viewvc/camel/branches/camel-2.10.x/components/camel-spring/src/main/java/org/apache/camel/spring/spi/BridgePropertyPlaceholderConfigurer.java?rev=1463994&r1=1463993&r2=1463994&view=diff
==============================================================================
--- camel/branches/camel-2.10.x/components/camel-spring/src/main/java/org/apache/camel/spring/spi/BridgePropertyPlaceholderConfigurer.java (original)
+++ camel/branches/camel-2.10.x/components/camel-spring/src/main/java/org/apache/camel/spring/spi/BridgePropertyPlaceholderConfigurer.java Wed Apr  3 13:16:48 2013
@@ -19,29 +19,36 @@ package org.apache.camel.spring.spi;
 import java.util.Properties;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.component.properties.AugmentedPropertyNameAwarePropertiesParser;
+import org.apache.camel.component.properties.PropertiesParser;
 import org.apache.camel.component.properties.PropertiesResolver;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
 import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
+import org.springframework.util.PropertyPlaceholderHelper;
 
 /**
  * A {@link PropertyPlaceholderConfigurer} that bridges Camel's <a href="http://camel.apache.org/using-propertyplaceholder.html">
  * property placeholder</a> with the Spring property placeholder mechanism.
  */
-public class BridgePropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer implements PropertiesResolver {
+public class BridgePropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer implements PropertiesResolver, AugmentedPropertyNameAwarePropertiesParser {
 
     // NOTE: this class must be in the spi package as if its in the root package, then Spring fails to parse the XML
     // files due some weird spring issue. But that is okay as having this class in the spi package is fine anyway.
 
     private final Properties properties = new Properties();
     private PropertiesResolver resolver;
+    private PropertiesParser parser;
     private String id;
+    private PropertyPlaceholderHelper helper;
 
     @Override
     protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props) throws BeansException {
+        super.processProperties(beanFactoryToProcess, props);
         // store all the spring properties so we can refer to them later
         properties.putAll(props);
-        super.processProperties(beanFactoryToProcess, props);
+        // create helper
+        helper = new PropertyPlaceholderHelper(placeholderPrefix, placeholderSuffix, valueSeparator, ignoreUnresolvablePlaceholders);
     }
 
     @Override
@@ -69,7 +76,67 @@ public class BridgePropertyPlaceholderCo
         return answer;
     }
 
+    @Override
+    public String parseUri(String text, Properties properties, String prefixToken, String suffixToken,
+                           String propertyPrefix, String propertySuffix, boolean fallbackToUnaugmentedProperty) throws IllegalArgumentException {
+
+        // first let Camel parse the text as it may contain Camel placeholders
+        String answer;
+        if (parser instanceof AugmentedPropertyNameAwarePropertiesParser) {
+            answer = ((AugmentedPropertyNameAwarePropertiesParser) parser).parseUri(text, properties, prefixToken, suffixToken,
+                    propertyPrefix, propertySuffix, fallbackToUnaugmentedProperty);
+        } else {
+            answer = parser.parseUri(text, properties, prefixToken, suffixToken);
+        }
+
+        // then let Spring parse it to resolve any Spring placeholders
+        if (answer != null) {
+            answer = springResolvePlaceholders(answer, properties);
+        } else {
+            answer = springResolvePlaceholders(text, properties);
+        }
+        return answer;
+    }
+
+    @Override
+    public String parseUri(String text, Properties properties, String prefixToken, String suffixToken) throws IllegalArgumentException {
+        String answer = parser.parseUri(text, properties, prefixToken, suffixToken);
+        if (answer != null) {
+            answer = springResolvePlaceholders(answer, properties);
+        } else {
+            answer = springResolvePlaceholders(text, properties);
+        }
+        return answer;
+    }
+
+    @Override
+    public String parseProperty(String key, String value, Properties properties) {
+        String answer = parser.parseProperty(key, value, properties);
+        if (answer != null) {
+            answer = springResolvePlaceholders(answer, properties);
+        } else {
+            answer = springResolvePlaceholders(value, properties);
+        }
+        return answer;
+    }
+
+    /**
+     * Resolves the placeholders using Spring's property placeholder functionality.
+     *
+     * @param text   the text which may contain spring placeholders
+     * @param properties the properties
+     * @return the parsed text with replaced placeholders, or the original text as is
+     */
+    protected String springResolvePlaceholders(String text, Properties properties) {
+        return helper.replacePlaceholders(text, properties);
+    }
+
     public void setResolver(PropertiesResolver resolver) {
         this.resolver = resolver;
     }
+
+    public void setParser(PropertiesParser parser) {
+        this.parser = parser;
+    }
+
 }