You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by gn...@apache.org on 2018/02/16 14:48:10 UTC

svn commit: r1824499 - in /aries/trunk/blueprint: blueprint-cm/ blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/ blueprint-core/ blueprint-core/src/main/java/org/apache/aries/blueprint/di/ blueprint-core/src/main/java/org/apache/ari...

Author: gnodet
Date: Fri Feb 16 14:48:09 2018
New Revision: 1824499

URL: http://svn.apache.org/viewvc?rev=1824499&view=rev
Log:
[ARIES-1298] Support typed configurations in property placeholders

Added:
    aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/AbstractPropertyPlaceholderExt.java
      - copied, changed from r1824428, aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/AbstractPropertyPlaceholder.java
    aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/PropertyPlaceholderExt.java
      - copied, changed from r1824428, aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/PropertyPlaceholder.java
    aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/evaluator/PropertyEvaluatorExt.java
      - copied, changed from r1824428, aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/evaluator/PropertyEvaluator.java
    aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/ExtendedValueMetadata.java
      - copied, changed from r1824428, aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/evaluator/PropertyEvaluator.java
Removed:
    aries/trunk/blueprint/blueprint-jexl-evaluator/src/main/java/org/apache/aries/blueprint/jexl/evaluator/JexlExpressionParser.java
Modified:
    aries/trunk/blueprint/blueprint-cm/pom.xml
    aries/trunk/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmPropertyPlaceholder.java
    aries/trunk/blueprint/blueprint-core/pom.xml
    aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/di/ValueRecipe.java
    aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/AbstractPropertyPlaceholder.java
    aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/PlaceholdersUtils.java
    aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/PropertyPlaceholder.java
    aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/evaluator/PropertyEvaluator.java
    aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/impl/ExtNamespaceHandler.java
    aries/trunk/blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/ext/PropertyPlaceholderTest.java
    aries/trunk/blueprint/blueprint-jexl-evaluator/pom.xml
    aries/trunk/blueprint/blueprint-jexl-evaluator/src/main/java/org/apache/aries/blueprint/jexl/evaluator/JexlPropertyEvaluator.java
    aries/trunk/blueprint/blueprint-jexl-evaluator/src/main/resources/OSGI-INF/blueprint/jexl.xml
    aries/trunk/blueprint/blueprint-noosgi/pom.xml
    aries/trunk/blueprint/blueprint-noosgi/src/main/java/org/apache/aries/blueprint/ext/AbstractPropertyPlaceholder.java
    aries/trunk/blueprint/blueprint-noosgi/src/main/java/org/apache/aries/blueprint/ext/PropertyPlaceholder.java
    aries/trunk/blueprint/blueprint-noosgi/src/main/java/org/apache/aries/blueprint/ext/impl/ExtNamespaceHandler.java
    aries/trunk/blueprint/blueprint-noosgi/src/test/java/org/apache/aries/blueprint/ext/PropertyPlaceholderTest.java
    aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/mutable/MutableValueMetadata.java
    aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/reflect/ValueMetadataImpl.java
    aries/trunk/blueprint/itests/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/cm/CmPropertyPlaceholderTest.java
    aries/trunk/blueprint/itests/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/cm/service/Foo.java
    aries/trunk/blueprint/itests/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/cm/service/FooInterface.java
    aries/trunk/blueprint/itests/blueprint-itests/src/test/resources/CmPropertyPlaceholderTest.xml
    aries/trunk/blueprint/parent/pom.xml

Modified: aries/trunk/blueprint/blueprint-cm/pom.xml
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-cm/pom.xml?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-cm/pom.xml (original)
+++ aries/trunk/blueprint/blueprint-cm/pom.xml Fri Feb 16 14:48:09 2018
@@ -31,7 +31,7 @@
     <groupId>org.apache.aries.blueprint</groupId>
     <artifactId>org.apache.aries.blueprint.cm</artifactId>
     <packaging>bundle</packaging>
-    <version>1.2.1-SNAPSHOT</version>
+    <version>1.3.0-SNAPSHOT</version>
     <name>Apache Aries Blueprint CM</name>
     <description>
         This bundle contains the ConfigAdmin namespace for blueprint.
@@ -56,8 +56,8 @@
         </aries.osgi.private.pkg>
 
         <blueprint.api.version>1.0.0</blueprint.api.version>
-        <blueprint.core.version>1.7.0</blueprint.core.version>
-        <blueprint.parser.version>1.4.0</blueprint.parser.version>
+        <blueprint.core.version>1.10.0-SNAPSHOT</blueprint.core.version>
+        <blueprint.parser.version>1.6.0-SNAPSHOT</blueprint.parser.version>
         <lastReleaseVersion>1.1.0</lastReleaseVersion>
     </properties>
 

Modified: aries/trunk/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmPropertyPlaceholder.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmPropertyPlaceholder.java?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmPropertyPlaceholder.java (original)
+++ aries/trunk/blueprint/blueprint-cm/src/main/java/org/apache/aries/blueprint/compendium/cm/CmPropertyPlaceholder.java Fri Feb 16 14:48:09 2018
@@ -22,7 +22,7 @@ import java.util.Dictionary;
 import java.util.Enumeration;
 import java.util.Properties;
 
-import org.apache.aries.blueprint.ext.PropertyPlaceholder;
+import org.apache.aries.blueprint.ext.PropertyPlaceholderExt;
 import org.apache.aries.blueprint.services.ExtendedBlueprintContainer;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.Constants;
@@ -35,7 +35,7 @@ import org.slf4j.LoggerFactory;
  *
  * @version $Rev$, $Date$
  */
-public class CmPropertyPlaceholder extends PropertyPlaceholder implements ManagedObject {
+public class CmPropertyPlaceholder extends PropertyPlaceholderExt implements ManagedObject {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(CmPropertyPlaceholder.class);
 
@@ -102,7 +102,7 @@ public class CmPropertyPlaceholder exten
         managedObjectManager.unregister(this);
     }
 
-    protected String getProperty(String val) {
+    protected Object getProperty(String val) {
         LOGGER.debug("Retrieving property value {} from configuration with pid {}", val, persistentId);
         Object v = null;
         if (properties != null) {
@@ -116,7 +116,7 @@ public class CmPropertyPlaceholder exten
         if (v == null) {
             v = super.getProperty(val);
         }
-        return v != null ? v.toString() : null;
+        return v;
     }
 
     public Bundle getBundle() {

Modified: aries/trunk/blueprint/blueprint-core/pom.xml
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-core/pom.xml?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-core/pom.xml (original)
+++ aries/trunk/blueprint/blueprint-core/pom.xml Fri Feb 16 14:48:09 2018
@@ -32,7 +32,7 @@
     <artifactId>org.apache.aries.blueprint.core</artifactId>
     <packaging>bundle</packaging>
     <name>Apache Aries Blueprint Core</name>
-    <version>1.9.1-SNAPSHOT</version>
+    <version>1.10.0-SNAPSHOT</version>
     <description>
         This bundle contains the core implementation of Blueprint
         along with the "ext" namespace handler.
@@ -82,7 +82,8 @@
             org.apache.aries.blueprint.proxy,
             org.apache.aries.blueprint.services,
             org.apache.aries.blueprint.utils.*,
-            org.apache.aries.util.tracker*
+            org.apache.aries.util.tracker*,
+            org.apache.felix.utils.properties
         </aries.osgi.private.pkg>
         <aries.osgi.export.service>
             org.apache.aries.blueprint.services.ParserService
@@ -93,7 +94,7 @@
         </aries.osgi.include.resource>
         <blueprint.annotation.api.version>1.0.0</blueprint.annotation.api.version>
         <blueprint.api.version>1.0.0</blueprint.api.version>
-        <blueprint.parser.version>1.5.0</blueprint.parser.version>
+        <blueprint.parser.version>1.6.0-SNAPSHOT</blueprint.parser.version>
         <proxy.api.version>1.1.0</proxy.api.version>
         <proxy.impl.version>1.1.0</proxy.impl.version>
         <quiesce.api.version>1.0.0</quiesce.api.version>
@@ -159,6 +160,12 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.utils</artifactId>
+            <version>1.10.4</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-simple</artifactId>
             <scope>test</scope>

Modified: aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/di/ValueRecipe.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/di/ValueRecipe.java?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/di/ValueRecipe.java (original)
+++ aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/di/ValueRecipe.java Fri Feb 16 14:48:09 2018
@@ -22,6 +22,7 @@ import java.lang.reflect.Type;
 import java.util.Collections;
 import java.util.List;
 
+import org.apache.aries.blueprint.ExtendedValueMetadata;
 import org.osgi.service.blueprint.container.ComponentDefinitionException;
 import org.osgi.service.blueprint.reflect.ValueMetadata;
 
@@ -51,7 +52,14 @@ public class ValueRecipe extends Abstrac
     protected Object internalCreate() throws ComponentDefinitionException {
         try {
             Type type = getValueType();
-            return convert(value.getStringValue(), type);
+            Object v = null;
+            if (value instanceof ExtendedValueMetadata) {
+                v = ((ExtendedValueMetadata) value).getValue();
+            }
+            if (v == null) {
+                v = value.getStringValue();
+            }
+            return convert(v, type);
         } catch (Exception e) {
             throw new ComponentDefinitionException(e);
         }

Modified: aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/AbstractPropertyPlaceholder.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/AbstractPropertyPlaceholder.java?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/AbstractPropertyPlaceholder.java (original)
+++ aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/AbstractPropertyPlaceholder.java Fri Feb 16 14:48:09 2018
@@ -65,6 +65,7 @@ import org.slf4j.LoggerFactory;
  *
  * @version $Rev$, $Date$
  */
+@Deprecated
 public abstract class AbstractPropertyPlaceholder implements ComponentDefinitionRegistryProcessor {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(AbstractPropertyPlaceholder.class);

Copied: aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/AbstractPropertyPlaceholderExt.java (from r1824428, aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/AbstractPropertyPlaceholder.java)
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/AbstractPropertyPlaceholderExt.java?p2=aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/AbstractPropertyPlaceholderExt.java&p1=aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/AbstractPropertyPlaceholder.java&r1=1824428&r2=1824499&rev=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/AbstractPropertyPlaceholder.java (original)
+++ aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/AbstractPropertyPlaceholderExt.java Fri Feb 16 14:48:09 2018
@@ -18,56 +18,31 @@
  */
 package org.apache.aries.blueprint.ext;
 
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
 import org.apache.aries.blueprint.ComponentDefinitionRegistry;
 import org.apache.aries.blueprint.ComponentDefinitionRegistryProcessor;
+import org.apache.aries.blueprint.ExtendedValueMetadata;
 import org.apache.aries.blueprint.PassThroughMetadata;
-import org.apache.aries.blueprint.mutable.MutableBeanArgument;
-import org.apache.aries.blueprint.mutable.MutableBeanMetadata;
-import org.apache.aries.blueprint.mutable.MutableBeanProperty;
-import org.apache.aries.blueprint.mutable.MutableCollectionMetadata;
-import org.apache.aries.blueprint.mutable.MutableMapEntry;
-import org.apache.aries.blueprint.mutable.MutableMapMetadata;
-import org.apache.aries.blueprint.mutable.MutablePropsMetadata;
-import org.apache.aries.blueprint.mutable.MutableReferenceListener;
-import org.apache.aries.blueprint.mutable.MutableRegistrationListener;
-import org.apache.aries.blueprint.mutable.MutableServiceMetadata;
-import org.apache.aries.blueprint.mutable.MutableServiceReferenceMetadata;
+import org.apache.aries.blueprint.mutable.*;
 import org.osgi.framework.Bundle;
 import org.osgi.service.blueprint.container.ComponentDefinitionException;
-import org.osgi.service.blueprint.reflect.BeanArgument;
-import org.osgi.service.blueprint.reflect.BeanMetadata;
-import org.osgi.service.blueprint.reflect.BeanProperty;
-import org.osgi.service.blueprint.reflect.CollectionMetadata;
-import org.osgi.service.blueprint.reflect.MapEntry;
-import org.osgi.service.blueprint.reflect.MapMetadata;
-import org.osgi.service.blueprint.reflect.Metadata;
-import org.osgi.service.blueprint.reflect.NonNullMetadata;
-import org.osgi.service.blueprint.reflect.PropsMetadata;
-import org.osgi.service.blueprint.reflect.ReferenceListMetadata;
-import org.osgi.service.blueprint.reflect.ReferenceListener;
-import org.osgi.service.blueprint.reflect.ReferenceMetadata;
-import org.osgi.service.blueprint.reflect.RegistrationListener;
-import org.osgi.service.blueprint.reflect.ServiceMetadata;
-import org.osgi.service.blueprint.reflect.ServiceReferenceMetadata;
-import org.osgi.service.blueprint.reflect.Target;
-import org.osgi.service.blueprint.reflect.ValueMetadata;
+import org.osgi.service.blueprint.reflect.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 /**
  * Abstract class for property placeholders.
  *
  * @version $Rev$, $Date$
  */
-public abstract class AbstractPropertyPlaceholder implements ComponentDefinitionRegistryProcessor {
+public abstract class AbstractPropertyPlaceholderExt implements ComponentDefinitionRegistryProcessor {
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(AbstractPropertyPlaceholder.class);
+    private static final Logger LOGGER = LoggerFactory.getLogger(AbstractPropertyPlaceholderExt.class);
 
     private String placeholderPrefix = "${";
     private String placeholderSuffix = "}";
@@ -435,11 +410,11 @@ public abstract class AbstractPropertyPl
         LOGGER.info(sb.toString());
     }
     
-    protected String retrieveValue(String expression) {
+    protected Object retrieveValue(String expression) {
         return getProperty(expression);
     }
     
-    protected String processString(String str) {
+    protected Object processString(String str) {
         // TODO: we need to handle escapes on the prefix / suffix
         Matcher matcher = getPattern().matcher(str);
         while (matcher.find()) {
@@ -449,10 +424,14 @@ public abstract class AbstractPropertyPl
                 matcher.region(matcher.start(1) + idx, str.length());
                 continue;
             }
-            String rep = retrieveValue(matcher.group(1));
+            Object rep = retrieveValue(matcher.group(1));
             if (rep != null) {
-                str = str.replace(matcher.group(0), rep);
-                matcher.reset(str);
+                if (rep instanceof String || !matcher.group(0).equals(str)) {
+                    str = str.replace(matcher.group(0), rep.toString());
+                    matcher.reset(str);
+                } else {
+                    return rep;
+                }
             }
         }
         if (nullValue != null && nullValue.equals(str)) {
@@ -461,7 +440,7 @@ public abstract class AbstractPropertyPl
         return str;
     }
 
-    protected String getProperty(String val) {
+    protected Object getProperty(String val) {
         return null;
     }
 
@@ -472,30 +451,46 @@ public abstract class AbstractPropertyPl
         return pattern;
     }
 
-    public class LateBindingValueMetadata implements ValueMetadata {
+    public class LateBindingValueMetadata implements ExtendedValueMetadata {
 
         private final ValueMetadata metadata;
         private boolean retrieved;
-        private String retrievedValue;
+        private Object retrievedValue;
 
         public LateBindingValueMetadata(ValueMetadata metadata) {
             this.metadata = metadata;
         }
 
         public String getStringValue() {
-            if (!retrieved) {
-                String v = metadata.getStringValue();
-                LOGGER.debug("Before process: {}", v);
-                retrievedValue = processString(v);
-                LOGGER.debug("After process: {}", retrievedValue);
-                
-                retrieved = true;
-            }
-            return retrievedValue;
+            retrieve();
+            return retrievedValue instanceof String ? (String) retrievedValue : null;
         }
 
         public String getType() {
             return metadata.getType();
         }
+
+        public Object getValue() {
+            retrieve();
+            return retrievedValue instanceof String ? null : retrievedValue;
+        }
+
+        private void retrieve() {
+            if (!retrieved) {
+                Object o = null;
+                if (metadata instanceof ExtendedValueMetadata) {
+                    o = ((ExtendedValueMetadata) metadata).getValue();
+                }
+                if (o == null) {
+                    String v = metadata.getStringValue();
+                    LOGGER.debug("Before process: {}", v);
+                    retrievedValue = processString(v);
+                    LOGGER.debug("After process: {}", retrievedValue);
+                } else {
+                    LOGGER.debug("Skipping non string value: {}", o);
+                }
+                retrieved = true;
+            }
+        }
     }
 }

Modified: aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/PlaceholdersUtils.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/PlaceholdersUtils.java?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/PlaceholdersUtils.java (original)
+++ aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/PlaceholdersUtils.java Fri Feb 16 14:48:09 2018
@@ -20,7 +20,6 @@ package org.apache.aries.blueprint.ext;
 
 import org.apache.aries.blueprint.ComponentDefinitionRegistry;
 import org.apache.aries.blueprint.ExtendedBeanMetadata;
-import org.apache.aries.blueprint.ext.AbstractPropertyPlaceholder;
 import org.apache.aries.blueprint.mutable.MutableBeanMetadata;
 import org.osgi.service.blueprint.container.ComponentDefinitionException;
 import org.osgi.service.blueprint.reflect.BeanMetadata;
@@ -42,7 +41,7 @@ public class PlaceholdersUtils {
             ComponentMetadata component = registry.getComponentDefinition(id);
             if (component instanceof ExtendedBeanMetadata) {
                 ExtendedBeanMetadata bean = (ExtendedBeanMetadata) component;
-                if (bean.getRuntimeClass() != null && AbstractPropertyPlaceholder.class.isAssignableFrom(bean.getRuntimeClass())) {
+                if (bean.getRuntimeClass() != null && AbstractPropertyPlaceholderExt.class.isAssignableFrom(bean.getRuntimeClass())) {
                     String otherPrefix = getPlaceholderProperty(bean, "placeholderPrefix");
                     String otherSuffix = getPlaceholderProperty(bean, "placeholderSuffix");
                     if (prefix.equals(otherPrefix) && suffix.equals(otherSuffix)) {

Modified: aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/PropertyPlaceholder.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/PropertyPlaceholder.java?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/PropertyPlaceholder.java (original)
+++ aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/PropertyPlaceholder.java Fri Feb 16 14:48:09 2018
@@ -32,8 +32,6 @@ import org.apache.aries.blueprint.Compon
 import org.apache.aries.blueprint.PassThroughMetadata;
 import org.apache.aries.blueprint.ext.evaluator.PropertyEvaluator;
 import org.apache.aries.blueprint.services.ExtendedBlueprintContainer;
-import org.osgi.framework.Bundle;
-import org.osgi.service.blueprint.container.BlueprintContainer;
 import org.osgi.service.blueprint.container.ComponentDefinitionException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -43,6 +41,7 @@ import org.slf4j.LoggerFactory;
  *
  * @version $Rev$, $Date$
  */
+@Deprecated
 public class PropertyPlaceholder extends AbstractPropertyPlaceholder {
 
     public enum SystemProperties {

Copied: aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/PropertyPlaceholderExt.java (from r1824428, aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/PropertyPlaceholder.java)
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/PropertyPlaceholderExt.java?p2=aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/PropertyPlaceholderExt.java&p1=aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/PropertyPlaceholder.java&r1=1824428&r2=1824499&rev=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/PropertyPlaceholder.java (original)
+++ aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/PropertyPlaceholderExt.java Fri Feb 16 14:48:09 2018
@@ -18,32 +18,31 @@
  */
 package org.apache.aries.blueprint.ext;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Field;
-import java.net.URL;
-import java.util.Dictionary;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
 import org.apache.aries.blueprint.ComponentDefinitionRegistry;
 import org.apache.aries.blueprint.PassThroughMetadata;
 import org.apache.aries.blueprint.ext.evaluator.PropertyEvaluator;
+import org.apache.aries.blueprint.ext.evaluator.PropertyEvaluatorExt;
 import org.apache.aries.blueprint.services.ExtendedBlueprintContainer;
-import org.osgi.framework.Bundle;
-import org.osgi.service.blueprint.container.BlueprintContainer;
+import org.apache.felix.utils.properties.Properties;
 import org.osgi.service.blueprint.container.ComponentDefinitionException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.net.URL;
+import java.util.AbstractMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 /**
  * Property placeholder that looks for properties in the System properties.
  *
  * @version $Rev$, $Date$
  */
-public class PropertyPlaceholder extends AbstractPropertyPlaceholder {
+public class PropertyPlaceholderExt extends AbstractPropertyPlaceholderExt {
 
     public enum SystemProperties {
         never,
@@ -51,21 +50,21 @@ public class PropertyPlaceholder extends
         override
     }
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(PropertyPlaceholder.class);
+    private static final Logger LOGGER = LoggerFactory.getLogger(PropertyPlaceholderExt.class);
 
-    private Map defaultProperties;
+    private Map<String, Object> defaultProperties;
     private Properties properties;
     private List<URL> locations;
     private boolean ignoreMissingLocations;
     private SystemProperties systemProperties = SystemProperties.fallback;
-    private PropertyEvaluator evaluator = null;
+    private PropertyEvaluatorExt evaluator = null;
     private ExtendedBlueprintContainer container;
 
-    public Map getDefaultProperties() {
+    public Map<String, Object> getDefaultProperties() {
         return defaultProperties;
     }
 
-    public void setDefaultProperties(Map defaultProperties) {
+    public void setDefaultProperties(Map<String, Object> defaultProperties) {
         this.defaultProperties = defaultProperties;
     }
 
@@ -93,11 +92,11 @@ public class PropertyPlaceholder extends
         this.systemProperties = systemProperties;
     }
 
-    public PropertyEvaluator getEvaluator() {
+    public PropertyEvaluatorExt getEvaluator() {
         return evaluator;
     }
 
-    public void setEvaluator(PropertyEvaluator evaluator) {
+    public void setEvaluator(PropertyEvaluatorExt evaluator) {
         this.evaluator = evaluator;
     }
 
@@ -132,7 +131,7 @@ public class PropertyPlaceholder extends
         super.process(registry);
     }
 
-    protected String getProperty(String val) {
+    protected Object getProperty(String val) {
         LOGGER.debug("Retrieving property {}", val);
         Object v = null;
         if (v == null && systemProperties == SystemProperties.override) {
@@ -162,7 +161,7 @@ public class PropertyPlaceholder extends
         if (v == null) {
             LOGGER.debug("Property {} not found", val);
         }
-        return v != null ? v.toString() : null;
+        return v;
     }
 
     protected String getSystemProperty(String val) {
@@ -204,49 +203,21 @@ public class PropertyPlaceholder extends
     }
 
     @Override
-    protected String retrieveValue(String expression) {
+    protected Object retrieveValue(String expression) {
         LOGGER.debug("Retrieving Value from expression: {}", expression);
         
         if (evaluator == null) {
             return super.retrieveValue(expression);
         } else {
-            return evaluator.evaluate(expression, new Dictionary<String, String>() {
+            return evaluator.evaluate(expression, new AbstractMap<String, Object>() {
                 @Override
-                public String get(Object key) {
+                public Object get(Object key) {
                     return getProperty((String) key);
                 }
-
-                // following are not important
-                @Override
-                public String put(String key, String value) {
-                    throw new UnsupportedOperationException();
-                }
-                
-                @Override
-                public Enumeration<String> elements() {
-                    throw new UnsupportedOperationException();
-                }
-                
-                @Override
-                public boolean isEmpty() {
-                    throw new UnsupportedOperationException();
-                }
-
-                @Override
-                public Enumeration<String> keys() {
-                    throw new UnsupportedOperationException();
-                }
-
-                @Override
-                public String remove(Object key) {
-                    throw new UnsupportedOperationException();
-                }
-
                 @Override
-                public int size() {
+                public Set<Entry<String, Object>> entrySet() {
                     throw new UnsupportedOperationException();
                 }
-                
             });
         }
 

Modified: aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/evaluator/PropertyEvaluator.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/evaluator/PropertyEvaluator.java?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/evaluator/PropertyEvaluator.java (original)
+++ aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/evaluator/PropertyEvaluator.java Fri Feb 16 14:48:09 2018
@@ -18,7 +18,7 @@ package org.apache.aries.blueprint.ext.e
 
 import java.util.Dictionary;
 
-
+@Deprecated
 public interface PropertyEvaluator {
     public String evaluate(String expression, Dictionary<String, String> properties);
 }

Copied: aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/evaluator/PropertyEvaluatorExt.java (from r1824428, aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/evaluator/PropertyEvaluator.java)
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/evaluator/PropertyEvaluatorExt.java?p2=aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/evaluator/PropertyEvaluatorExt.java&p1=aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/evaluator/PropertyEvaluator.java&r1=1824428&r2=1824499&rev=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/evaluator/PropertyEvaluator.java (original)
+++ aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/evaluator/PropertyEvaluatorExt.java Fri Feb 16 14:48:09 2018
@@ -16,9 +16,11 @@
  */
 package org.apache.aries.blueprint.ext.evaluator;
 
-import java.util.Dictionary;
+import java.util.Map;
 
 
-public interface PropertyEvaluator {
-    public String evaluate(String expression, Dictionary<String, String> properties);
+public interface PropertyEvaluatorExt {
+
+    Object evaluate(String expression, Map<String, Object> properties);
+
 }

Modified: aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/impl/ExtNamespaceHandler.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/impl/ExtNamespaceHandler.java?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/impl/ExtNamespaceHandler.java (original)
+++ aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/impl/ExtNamespaceHandler.java Fri Feb 16 14:48:09 2018
@@ -26,8 +26,8 @@ import org.apache.aries.blueprint.Extend
 import org.apache.aries.blueprint.ParserContext;
 import org.apache.aries.blueprint.container.NullProxy;
 import org.apache.aries.blueprint.ext.PlaceholdersUtils;
-import org.apache.aries.blueprint.ext.PropertyPlaceholder;
-import org.apache.aries.blueprint.ext.evaluator.PropertyEvaluator;
+import org.apache.aries.blueprint.ext.PropertyPlaceholderExt;
+import org.apache.aries.blueprint.ext.evaluator.PropertyEvaluatorExt;
 import org.apache.aries.blueprint.mutable.MutableBeanMetadata;
 import org.apache.aries.blueprint.mutable.MutableCollectionMetadata;
 import org.apache.aries.blueprint.mutable.MutableComponentMetadata;
@@ -157,7 +157,7 @@ public class ExtNamespaceHandler impleme
 
     public Set<Class> getManagedClasses() {
         return new HashSet<Class>(Arrays.asList(
-                PropertyPlaceholder.class
+                PropertyPlaceholderExt.class
         ));
     }
 
@@ -424,7 +424,7 @@ public class ExtNamespaceHandler impleme
         metadata.setProcessor(true);
         metadata.setId(getId(context, element));
         metadata.setScope(BeanMetadata.SCOPE_SINGLETON);
-        metadata.setRuntimeClass(PropertyPlaceholder.class);
+        metadata.setRuntimeClass(PropertyPlaceholderExt.class);
         metadata.setInitMethod("init");
         String prefix = element.hasAttribute(PLACEHOLDER_PREFIX_ATTRIBUTE)
                                     ? element.getAttribute(PLACEHOLDER_PREFIX_ATTRIBUTE)
@@ -547,11 +547,11 @@ public class ExtNamespaceHandler impleme
         m.setComponentId(value);
         return m;
     }
-    
+
     private MutableReferenceMetadata createReference(ParserContext context, String value) {
         MutableReferenceMetadata m = context.createMetadata(MutableReferenceMetadata.class);
         // use the class instance directly rather than loading the class from the specified the interface name.
-        m.setRuntimeInterface(PropertyEvaluator.class);
+        m.setRuntimeInterface(PropertyEvaluatorExt.class);
         m.setFilter("(org.apache.aries.blueprint.ext.evaluator.name=" + value + ")");
         m.setBundleContext(ctx);
         return m;

Modified: aries/trunk/blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/ext/PropertyPlaceholderTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/ext/PropertyPlaceholderTest.java?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/ext/PropertyPlaceholderTest.java (original)
+++ aries/trunk/blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/ext/PropertyPlaceholderTest.java Fri Feb 16 14:48:09 2018
@@ -27,7 +27,7 @@ import org.junit.Before;
 import org.junit.Test;
 import org.osgi.service.blueprint.reflect.ValueMetadata;
 
-public class PropertyPlaceholderTest extends PropertyPlaceholder {
+public class PropertyPlaceholderTest extends PropertyPlaceholderExt {
     private final Map<String,String> values = new HashMap<String,String>();
     private LateBindingValueMetadata sut;
     

Modified: aries/trunk/blueprint/blueprint-jexl-evaluator/pom.xml
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-jexl-evaluator/pom.xml?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-jexl-evaluator/pom.xml (original)
+++ aries/trunk/blueprint/blueprint-jexl-evaluator/pom.xml Fri Feb 16 14:48:09 2018
@@ -32,7 +32,7 @@
     <artifactId>org.apache.aries.blueprint.jexl.evaluator</artifactId>
     <packaging>bundle</packaging>
     <name>Apache Aries Blueprint JEXL evaluator</name>
-    <version>1.0.1-SNAPSHOT</version>
+    <version>1.1.0-SNAPSHOT</version>
     <description>
         This bundle contains a plugin to the "ext" namespace handler for evaluating expressions using JEXL
     </description>
@@ -55,7 +55,7 @@
         <aries.osgi.private.pkg>
             org.apache.aries.blueprint.jexl.evaluator
         </aries.osgi.private.pkg>
-        <blueprint.core.version>1.0.0</blueprint.core.version>
+        <blueprint.core.version>1.10.0-SNAPSHOT</blueprint.core.version>
         <lastReleaseVersion>1.0.0</lastReleaseVersion>
     </properties>
 

Modified: aries/trunk/blueprint/blueprint-jexl-evaluator/src/main/java/org/apache/aries/blueprint/jexl/evaluator/JexlPropertyEvaluator.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-jexl-evaluator/src/main/java/org/apache/aries/blueprint/jexl/evaluator/JexlPropertyEvaluator.java?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-jexl-evaluator/src/main/java/org/apache/aries/blueprint/jexl/evaluator/JexlPropertyEvaluator.java (original)
+++ aries/trunk/blueprint/blueprint-jexl-evaluator/src/main/java/org/apache/aries/blueprint/jexl/evaluator/JexlPropertyEvaluator.java Fri Feb 16 14:48:09 2018
@@ -16,97 +16,30 @@
  */
 package org.apache.aries.blueprint.jexl.evaluator;
 
-import java.util.Collection;
-import java.util.Dictionary;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
-import org.apache.aries.blueprint.ext.evaluator.PropertyEvaluator;
+import org.apache.aries.blueprint.ext.evaluator.PropertyEvaluatorExt;
+import org.apache.commons.jexl2.Expression;
+import org.apache.commons.jexl2.JexlEngine;
+import org.apache.commons.jexl2.MapContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class JexlPropertyEvaluator implements PropertyEvaluator {
+public class JexlPropertyEvaluator implements PropertyEvaluatorExt {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(JexlPropertyEvaluator.class);
-    
-    private JexlExpressionParser jexlParser;
-    private Dictionary<String, String> properties;
-    
-    public String evaluate(String expression, Dictionary<String, String> properties) {
-        JexlExpressionParser parser = getJexlParser();
-        this.properties = properties;
 
-        Object obj;
+    public Object evaluate(String expression, Map<String, Object> properties) {
         try {
-            obj = parser.evaluate(expression);
-            if (obj!=null) {
-                return obj.toString();
-            }
+            JexlEngine engine = new JexlEngine();
+            MapContext context = new MapContext(properties);
+            Expression exp = engine.createExpression(expression);
+            return exp.evaluate(context);
         } catch (Exception e) {
             LOGGER.info("Could not evaluate expression: {}", expression);
             LOGGER.info("Exception:", e);
+            return null;
         }
-        
-        return null;
-    }
-    
-    private synchronized JexlExpressionParser getJexlParser() {
-        if (jexlParser == null) {
-            jexlParser = new JexlExpressionParser(toMap());
-        }
-        return jexlParser;
     }
 
-    private Map<String, Object> toMap() {
-        return new Map<String, Object>() {
-            public boolean containsKey(Object o) {
-                return properties.get(o) != null;
-            }
-            
-            public Object get(Object o) {
-                return properties.get(o);
-            }
-            
-            // following are not important
-            public Object put(String s, Object o) {
-                throw new UnsupportedOperationException();
-            }
-            
-            public int size() {
-                throw new UnsupportedOperationException();
-            }
-
-            public boolean isEmpty() {
-                throw new UnsupportedOperationException();
-            }
-
-            public boolean containsValue(Object o) {
-                throw new UnsupportedOperationException();
-            }
-
-            public Object remove(Object o) {
-                throw new UnsupportedOperationException();
-            }
-
-            public void putAll(Map<? extends String, ? extends Object> map) {
-                throw new UnsupportedOperationException();
-            }
-
-            public void clear() {
-                throw new UnsupportedOperationException();
-            }
-
-            public Set<String> keySet() {
-                throw new UnsupportedOperationException();
-            }
-
-            public Collection<Object> values() {
-                throw new UnsupportedOperationException();
-            }
-
-            public Set<Entry<String, Object>> entrySet() {
-                throw new UnsupportedOperationException();
-            }
-        };
-    }
 }

Modified: aries/trunk/blueprint/blueprint-jexl-evaluator/src/main/resources/OSGI-INF/blueprint/jexl.xml
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-jexl-evaluator/src/main/resources/OSGI-INF/blueprint/jexl.xml?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-jexl-evaluator/src/main/resources/OSGI-INF/blueprint/jexl.xml (original)
+++ aries/trunk/blueprint/blueprint-jexl-evaluator/src/main/resources/OSGI-INF/blueprint/jexl.xml Fri Feb 16 14:48:09 2018
@@ -19,7 +19,7 @@
 -->
 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
 
-	<service interface="org.apache.aries.blueprint.ext.evaluator.PropertyEvaluator">
+	<service interface="org.apache.aries.blueprint.ext.evaluator.PropertyEvaluatorExt">
         <service-properties>
             <entry key="org.apache.aries.blueprint.ext.evaluator.name" value="jexl" />
         </service-properties>

Modified: aries/trunk/blueprint/blueprint-noosgi/pom.xml
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-noosgi/pom.xml?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-noosgi/pom.xml (original)
+++ aries/trunk/blueprint/blueprint-noosgi/pom.xml Fri Feb 16 14:48:09 2018
@@ -45,8 +45,8 @@
 
     <properties>
         <blueprint.api.version>1.0.1</blueprint.api.version>
-        <blueprint.core.version>1.9.0</blueprint.core.version>
-        <blueprint.parser.version>1.5.0</blueprint.parser.version>
+        <blueprint.core.version>1.10.0-SNAPSHOT</blueprint.core.version>
+        <blueprint.parser.version>1.6.0-SNAPSHOT</blueprint.parser.version>
         <proxy.impl.version>1.0.3</proxy.impl.version>
     </properties>
 
@@ -109,6 +109,12 @@
         </dependency>
         -->
         <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.utils</artifactId>
+            <version>1.10.4</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
             <scope>provided</scope>

Modified: aries/trunk/blueprint/blueprint-noosgi/src/main/java/org/apache/aries/blueprint/ext/AbstractPropertyPlaceholder.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-noosgi/src/main/java/org/apache/aries/blueprint/ext/AbstractPropertyPlaceholder.java?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-noosgi/src/main/java/org/apache/aries/blueprint/ext/AbstractPropertyPlaceholder.java (original)
+++ aries/trunk/blueprint/blueprint-noosgi/src/main/java/org/apache/aries/blueprint/ext/AbstractPropertyPlaceholder.java Fri Feb 16 14:48:09 2018
@@ -26,6 +26,7 @@ import java.util.regex.Pattern;
 
 import org.apache.aries.blueprint.ComponentDefinitionRegistry;
 import org.apache.aries.blueprint.ComponentDefinitionRegistryProcessor;
+import org.apache.aries.blueprint.ExtendedValueMetadata;
 import org.apache.aries.blueprint.PassThroughMetadata;
 import org.apache.aries.blueprint.mutable.MutableBeanArgument;
 import org.apache.aries.blueprint.mutable.MutableBeanMetadata;
@@ -62,6 +63,7 @@ public abstract class AbstractPropertyPl
     private ExtendedBlueprintContainer blueprintContainer;
     private String placeholderPrefix = "${";
     private String placeholderSuffix = "}";
+    private String nullValue = null;
     private Pattern pattern;
 
     private LinkedList<String> processingStack = new LinkedList<String>();
@@ -82,6 +84,14 @@ public abstract class AbstractPropertyPl
         this.placeholderSuffix = placeholderSuffix;
     }
 
+    public String getNullValue() {
+        return nullValue;
+    }
+
+    public void setNullValue(String nullValue) {
+        this.nullValue = nullValue;
+    }
+
     public ExtendedBlueprintContainer getBlueprintContainer() {
         return blueprintContainer;
     }
@@ -310,11 +320,11 @@ public abstract class AbstractPropertyPl
         LOGGER.info(sb.toString());
     }
 
-    protected String retrieveValue(String expression) {
+    protected Object retrieveValue(String expression) {
         return getProperty(expression);
     }
 
-    protected String processString(String str) {
+    protected Object processString(String str) {
         // TODO: we need to handle escapes on the prefix / suffix
         Matcher matcher = getPattern().matcher(str);
         while (matcher.find()) {
@@ -324,16 +334,23 @@ public abstract class AbstractPropertyPl
                 matcher.region(matcher.start(1) + idx, str.length());
                 continue;
             }
-            String rep = retrieveValue(matcher.group(1));
+            Object rep = retrieveValue(matcher.group(1));
             if (rep != null) {
-                str = str.replace(matcher.group(0), rep);
-                matcher.reset(str);
+                if (rep instanceof String || !matcher.group(0).equals(str)) {
+                    str = str.replace(matcher.group(0), rep.toString());
+                    matcher.reset(str);
+                } else {
+                    return rep;
+                }
             }
         }
+        if (nullValue != null && nullValue.equals(str)) {
+            return null;
+        }
         return str;
     }
 
-    protected String getProperty(String val) {
+    protected Object getProperty(String val) {
         return null;
     }
 
@@ -344,30 +361,46 @@ public abstract class AbstractPropertyPl
         return pattern;
     }
 
-    public class LateBindingValueMetadata implements ValueMetadata {
+    public class LateBindingValueMetadata implements ExtendedValueMetadata {
 
         private final ValueMetadata metadata;
         private boolean retrieved;
-        private String retrievedValue;
+        private Object retrievedValue;
 
         public LateBindingValueMetadata(ValueMetadata metadata) {
             this.metadata = metadata;
         }
 
         public String getStringValue() {
-            if (!retrieved) {
-                String v = metadata.getStringValue();
-                LOGGER.debug("Before process: {}", v);
-                retrievedValue = processString(v);
-                LOGGER.debug("After process: {}", retrievedValue);
-
-                retrieved = true;
-            }
-            return retrievedValue;
+            retrieve();
+            return retrievedValue instanceof String ? (String) retrievedValue : null;
         }
 
         public String getType() {
             return metadata.getType();
         }
+
+        public Object getValue() {
+            retrieve();
+            return retrievedValue instanceof String ? null : retrievedValue;
+        }
+
+        private void retrieve() {
+            if (!retrieved) {
+                Object o = null;
+                if (metadata instanceof ExtendedValueMetadata) {
+                    o = ((ExtendedValueMetadata) metadata).getValue();
+                }
+                if (o == null) {
+                    String v = metadata.getStringValue();
+                    LOGGER.debug("Before process: {}", v);
+                    retrievedValue = processString(v);
+                    LOGGER.debug("After process: {}", retrievedValue);
+                } else {
+                    LOGGER.debug("Skipping non string value: {}", o);
+                }
+                retrieved = true;
+            }
+        }
     }
 }

Modified: aries/trunk/blueprint/blueprint-noosgi/src/main/java/org/apache/aries/blueprint/ext/PropertyPlaceholder.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-noosgi/src/main/java/org/apache/aries/blueprint/ext/PropertyPlaceholder.java?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-noosgi/src/main/java/org/apache/aries/blueprint/ext/PropertyPlaceholder.java (original)
+++ aries/trunk/blueprint/blueprint-noosgi/src/main/java/org/apache/aries/blueprint/ext/PropertyPlaceholder.java Fri Feb 16 14:48:09 2018
@@ -21,13 +21,14 @@ package org.apache.aries.blueprint.ext;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
-import java.util.Dictionary;
-import java.util.Enumeration;
+import java.util.AbstractMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Properties;
+import java.util.Set;
 
 import org.apache.aries.blueprint.ext.evaluator.PropertyEvaluator;
+import org.apache.aries.blueprint.ext.evaluator.PropertyEvaluatorExt;
+import org.apache.felix.utils.properties.Properties;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -46,12 +47,12 @@ public class PropertyPlaceholder extends
 
     private static final Logger LOGGER = LoggerFactory.getLogger(PropertyPlaceholder.class);
 
-    private Map defaultProperties;
+    private Map<String, Object> defaultProperties;
     private Properties properties;
     private List<String> locations;
     private boolean ignoreMissingLocations;
     private SystemProperties systemProperties = SystemProperties.override;
-    private PropertyEvaluator evaluator = null;
+    private PropertyEvaluatorExt evaluator = null;
 
     public Map getDefaultProperties() {
         return defaultProperties;
@@ -85,11 +86,11 @@ public class PropertyPlaceholder extends
         this.systemProperties = systemProperties;
     }
 
-    public PropertyEvaluator getEvaluator() {
+    public PropertyEvaluatorExt getEvaluator() {
         return evaluator;
     }
 
-    public void setEvaluator(PropertyEvaluator evaluator) {
+    public void setEvaluator(PropertyEvaluatorExt evaluator) {
         this.evaluator = evaluator;
     }
 
@@ -122,7 +123,7 @@ public class PropertyPlaceholder extends
         }
     }
 
-    protected String getProperty(String val) {
+    protected Object getProperty(String val) {
         LOGGER.debug("Retrieving property {}", val);
         Object v = null;
         if (v == null && systemProperties == SystemProperties.override) {
@@ -152,53 +153,25 @@ public class PropertyPlaceholder extends
         if (v == null) {
             LOGGER.debug("Property {} not found", val);
         }
-        return v != null ? v.toString() : null;
+        return v;
     }
 
     @Override
-    protected String retrieveValue(String expression) {
+    protected Object retrieveValue(String expression) {
         LOGGER.debug("Retrieving Value from expression: {}", expression);
 
         if (evaluator == null) {
             return super.retrieveValue(expression);
         } else {
-            return evaluator.evaluate(expression, new Dictionary<String, String>(){
+            return evaluator.evaluate(expression, new AbstractMap<String, Object>() {
                 @Override
-                public String get(Object key) {
+                public Object get(Object key) {
                     return getProperty((String) key);
                 }
-
-                // following are not important
-                @Override
-                public String put(String key, String value) {
-                    throw new UnsupportedOperationException();
-                }
-
-                @Override
-                public Enumeration<String> elements() {
-                    throw new UnsupportedOperationException();
-                }
-
-                @Override
-                public boolean isEmpty() {
-                    throw new UnsupportedOperationException();
-                }
-
-                @Override
-                public Enumeration<String> keys() {
-                    throw new UnsupportedOperationException();
-                }
-
                 @Override
-                public String remove(Object key) {
+                public Set<Entry<String, Object>> entrySet() {
                     throw new UnsupportedOperationException();
                 }
-
-                @Override
-                public int size() {
-                    throw new UnsupportedOperationException();
-                }
-
             });
         }
 

Modified: aries/trunk/blueprint/blueprint-noosgi/src/main/java/org/apache/aries/blueprint/ext/impl/ExtNamespaceHandler.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-noosgi/src/main/java/org/apache/aries/blueprint/ext/impl/ExtNamespaceHandler.java?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-noosgi/src/main/java/org/apache/aries/blueprint/ext/impl/ExtNamespaceHandler.java (original)
+++ aries/trunk/blueprint/blueprint-noosgi/src/main/java/org/apache/aries/blueprint/ext/impl/ExtNamespaceHandler.java Fri Feb 16 14:48:09 2018
@@ -24,7 +24,6 @@ import java.util.*;
 import org.apache.aries.blueprint.*;
 import org.apache.aries.blueprint.container.NullProxy;
 import org.apache.aries.blueprint.ext.AbstractPropertyPlaceholder;
-import org.apache.aries.blueprint.ext.PlaceholdersUtils;
 import org.apache.aries.blueprint.ext.PropertyPlaceholder;
 import org.apache.aries.blueprint.mutable.MutableBeanMetadata;
 import org.apache.aries.blueprint.mutable.MutableCollectionMetadata;

Modified: aries/trunk/blueprint/blueprint-noosgi/src/test/java/org/apache/aries/blueprint/ext/PropertyPlaceholderTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-noosgi/src/test/java/org/apache/aries/blueprint/ext/PropertyPlaceholderTest.java?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-noosgi/src/test/java/org/apache/aries/blueprint/ext/PropertyPlaceholderTest.java (original)
+++ aries/trunk/blueprint/blueprint-noosgi/src/test/java/org/apache/aries/blueprint/ext/PropertyPlaceholderTest.java Fri Feb 16 14:48:09 2018
@@ -28,7 +28,7 @@ import org.junit.Test;
 import org.osgi.service.blueprint.reflect.ValueMetadata;
 
 public class PropertyPlaceholderTest extends PropertyPlaceholder {
-    private final Map<String,String> values = new HashMap<String,String>();
+    private final Map<String,Object> values = new HashMap<String,Object>();
     private LateBindingValueMetadata sut;
 
     @Before
@@ -113,7 +113,7 @@ public class PropertyPlaceholderTest ext
      */
 
     // Override to simulate actual property retrieval
-    protected String getProperty(String prop) {
+    protected Object getProperty(String prop) {
         return values.get(prop);
     }
 

Copied: aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/ExtendedValueMetadata.java (from r1824428, aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/evaluator/PropertyEvaluator.java)
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/ExtendedValueMetadata.java?p2=aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/ExtendedValueMetadata.java&p1=aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/evaluator/PropertyEvaluator.java&r1=1824428&r2=1824499&rev=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/ext/evaluator/PropertyEvaluator.java (original)
+++ aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/ExtendedValueMetadata.java Fri Feb 16 14:48:09 2018
@@ -14,11 +14,12 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package org.apache.aries.blueprint.ext.evaluator;
+package org.apache.aries.blueprint;
 
-import java.util.Dictionary;
+import org.osgi.service.blueprint.reflect.ValueMetadata;
 
+public interface ExtendedValueMetadata extends ValueMetadata {
+
+    Object getValue();
 
-public interface PropertyEvaluator {
-    public String evaluate(String expression, Dictionary<String, String> properties);
 }

Modified: aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/mutable/MutableValueMetadata.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/mutable/MutableValueMetadata.java?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/mutable/MutableValueMetadata.java (original)
+++ aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/mutable/MutableValueMetadata.java Fri Feb 16 14:48:09 2018
@@ -18,6 +18,7 @@
  */
 package org.apache.aries.blueprint.mutable;
 
+import org.apache.aries.blueprint.ExtendedValueMetadata;
 import org.osgi.service.blueprint.reflect.ValueMetadata;
 
 /**
@@ -25,10 +26,12 @@ import org.osgi.service.blueprint.reflec
  *
  * @version $Rev$, $Date$
  */
-public interface MutableValueMetadata extends ValueMetadata {
+public interface MutableValueMetadata extends ExtendedValueMetadata {
 
     void setStringValue(String stringValue);
 
     void setType(String type);
 
+    void setValue(Object value);
+
 }

Modified: aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/reflect/ValueMetadataImpl.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/reflect/ValueMetadataImpl.java?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/reflect/ValueMetadataImpl.java (original)
+++ aries/trunk/blueprint/blueprint-parser/src/main/java/org/apache/aries/blueprint/reflect/ValueMetadataImpl.java Fri Feb 16 14:48:09 2018
@@ -18,6 +18,7 @@
  */
 package org.apache.aries.blueprint.reflect;
 
+import org.apache.aries.blueprint.ExtendedValueMetadata;
 import org.apache.aries.blueprint.mutable.MutableValueMetadata;
 import org.osgi.service.blueprint.reflect.ValueMetadata;
 
@@ -30,6 +31,7 @@ public class ValueMetadataImpl implement
 
     private String stringValue;
     private String type;
+    private Object value;
 
     public ValueMetadataImpl() {
     }
@@ -43,9 +45,16 @@ public class ValueMetadataImpl implement
         this.type = type;
     }
 
+    public ValueMetadataImpl(Object value) {
+        this.value = value;
+    }
+
     public ValueMetadataImpl(ValueMetadata source) {
         this.stringValue = source.getStringValue();
         this.type = source.getType();
+        if (source instanceof ExtendedValueMetadata) {
+            this.value = ((ExtendedValueMetadata) source).getValue();
+        }
     }
 
     public String getStringValue() {
@@ -64,11 +73,20 @@ public class ValueMetadataImpl implement
         this.type = typeName;
     }
 
+    public Object getValue() {
+        return value;
+    }
+
+    public void setValue(Object value) {
+        this.value = value;
+    }
+
     @Override
     public String toString() {
         return "ValueMetadata[" +
                 "stringValue='" + stringValue + '\'' +
                 ", type='" + type + '\'' +
+                ", value='" + value + '\'' +
                 ']';
     }
 }

Modified: aries/trunk/blueprint/itests/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/cm/CmPropertyPlaceholderTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/itests/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/cm/CmPropertyPlaceholderTest.java?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/itests/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/cm/CmPropertyPlaceholderTest.java (original)
+++ aries/trunk/blueprint/itests/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/cm/CmPropertyPlaceholderTest.java Fri Feb 16 14:48:09 2018
@@ -90,7 +90,7 @@ public class CmPropertyPlaceholderTest e
         assertThat(foo.getC(), nullValue());
 
         Configuration cf = ca.getConfiguration("blueprint-sample-properties.pid", null);
-        Hashtable<String,String> props = new Hashtable<String,String>();
+        Hashtable<String,Object> props = new Hashtable<String,Object>();
         props.put("pb", "43");
         cf.update(props);
         Thread.sleep(500);
@@ -98,6 +98,16 @@ public class CmPropertyPlaceholderTest e
         foo = (FooInterface)context().getService(sr);
         assertEquals("43", foo.getB());
 
+        props.clear();
+        props.put("pc", 7);
+        props.put("pd", new int[] { 3, 4 });
+        cf.update(props);
+        Thread.sleep(500);
+        sr = getServiceRef(FooInterface.class, "(key=foo5)");
+        foo = (FooInterface)context().getService(sr);
+        assertEquals(7L, (long) foo.getC());
+        assertArrayEquals(new int[] { 3, 4 }, (int[]) foo.getD());
+
         cf.delete();
         Thread.sleep(500);
         sr = getServiceRef(FooInterface.class, "(key=foo5)");

Modified: aries/trunk/blueprint/itests/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/cm/service/Foo.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/itests/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/cm/service/Foo.java?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/itests/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/cm/service/Foo.java (original)
+++ aries/trunk/blueprint/itests/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/cm/service/Foo.java Fri Feb 16 14:48:09 2018
@@ -29,6 +29,7 @@ public class Foo implements FooInterface
     private int a;
     private String b;
     private Long c;
+    private Object d;
     private Properties props;
 
     public int getA() {
@@ -56,6 +57,14 @@ public class Foo implements FooInterface
         this.c = c;
     }
 
+    public Object getD() {
+        return d;
+    }
+
+    public void setD(Object d) {
+        this.d = d;
+    }
+
     public Properties getProps() {
         return props;
     }

Modified: aries/trunk/blueprint/itests/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/cm/service/FooInterface.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/itests/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/cm/service/FooInterface.java?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/itests/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/cm/service/FooInterface.java (original)
+++ aries/trunk/blueprint/itests/blueprint-itests/src/test/java/org/apache/aries/blueprint/itests/cm/service/FooInterface.java Fri Feb 16 14:48:09 2018
@@ -26,6 +26,8 @@ public interface FooInterface {
 
     Long getC();
 
+    Object getD();
+
     Properties getProps();
 
 }

Modified: aries/trunk/blueprint/itests/blueprint-itests/src/test/resources/CmPropertyPlaceholderTest.xml
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/itests/blueprint-itests/src/test/resources/CmPropertyPlaceholderTest.xml?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/itests/blueprint-itests/src/test/resources/CmPropertyPlaceholderTest.xml (original)
+++ aries/trunk/blueprint/itests/blueprint-itests/src/test/resources/CmPropertyPlaceholderTest.xml Fri Feb 16 14:48:09 2018
@@ -28,6 +28,7 @@
     <bean id="foo" class="org.apache.aries.blueprint.itests.cm.service.Foo">
         <property name="b" value="${pb}"/>
         <property name="c" value="${pc}"/>
+        <property name="d" value="${pd}"/>
     </bean>
     <service id="myService" interface="org.apache.aries.blueprint.itests.cm.service.FooInterface" ref="foo">
         <service-properties>

Modified: aries/trunk/blueprint/parent/pom.xml
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/parent/pom.xml?rev=1824499&r1=1824498&r2=1824499&view=diff
==============================================================================
--- aries/trunk/blueprint/parent/pom.xml (original)
+++ aries/trunk/blueprint/parent/pom.xml Fri Feb 16 14:48:09 2018
@@ -45,13 +45,13 @@
 
     <properties>
         <blueprint.api.dev.version>1.0.2-SNAPSHOT</blueprint.api.dev.version>
-        <blueprint.core.dev.version>1.9.1-SNAPSHOT</blueprint.core.dev.version>
-        <blueprint.cm.dev.version>1.2.1-SNAPSHOT</blueprint.cm.dev.version>
+        <blueprint.core.dev.version>1.10.0-SNAPSHOT</blueprint.core.dev.version>
+        <blueprint.cm.dev.version>1.3.0-SNAPSHOT</blueprint.cm.dev.version>
         <blueprint.parser.dev.version>1.6.0-SNAPSHOT</blueprint.parser.dev.version>
         <blueprint.authz.dev.version>1.0.1-SNAPSHOT</blueprint.authz.dev.version>
         <blueprint.spring.dev.version>1.0.0-SNAPSHOT</blueprint.spring.dev.version>
         <blueprint.spring.extender.dev.version>1.0.0-SNAPSHOT</blueprint.spring.extender.dev.version>
-        <blueprint.jexl.evaluator.dev.version>1.0.1-SNAPSHOT</blueprint.jexl.evaluator.dev.version>
+        <blueprint.jexl.evaluator.dev.version>1.1.0-SNAPSHOT</blueprint.jexl.evaluator.dev.version>
         <blueprint.sample.dev.version>1.0.1-SNAPSHOT</blueprint.sample.dev.version>
         <blueprint.sample.fragment.dev.version>1.0.1-SNAPSHOT</blueprint.sample.fragment.dev.version>
         <blueprint.noosgi.dev.version>1.2.0-SNAPSHOT</blueprint.noosgi.dev.version>