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 2013/03/27 16:07:20 UTC

svn commit: r1461632 - in /aries/trunk/blueprint/blueprint-noosgi/src: main/java/org/apache/aries/blueprint/ext/impl/ExtNamespaceHandler.java test/java/org.apache.aries.blueprint/BlueprintContainerTest.java test/resources/test2.xml

Author: gnodet
Date: Wed Mar 27 15:07:20 2013
New Revision: 1461632

URL: http://svn.apache.org/r1461632
Log:
[ARIES-1038] Improve placeholders to support multiple compatible placeholders

Added:
    aries/trunk/blueprint/blueprint-noosgi/src/test/resources/test2.xml
Modified:
    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/BlueprintContainerTest.java

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=1461632&r1=1461631&r2=1461632&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 Wed Mar 27 15:07:20 2013
@@ -18,8 +18,11 @@
  */
 package org.apache.aries.blueprint.ext.impl;
 
+import org.apache.aries.blueprint.ComponentDefinitionRegistry;
+import org.apache.aries.blueprint.ExtendedBeanMetadata;
 import org.apache.aries.blueprint.ExtendedReferenceListMetadata;
 import org.apache.aries.blueprint.ParserContext;
+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.ext.evaluator.PropertyEvaluator;
@@ -258,11 +261,92 @@ public class ExtNamespaceHandler impleme
             metadata.addProperty("locations", createList(context, locations));
         }
 
-        PlaceholdersUtils.validatePlaceholder(metadata, context.getComponentDefinitionRegistry());
+        boolean result = validatePlaceholder(metadata, context.getComponentDefinitionRegistry());
 
-        return metadata;
+        return result ? metadata : null;
     }
 
+    private boolean validatePlaceholder(MutableBeanMetadata metadata, ComponentDefinitionRegistry registry) {
+        for (String id : registry.getComponentDefinitionNames()) {
+            ComponentMetadata component = registry.getComponentDefinition(id);
+            if (component instanceof ExtendedBeanMetadata) {
+                ExtendedBeanMetadata bean = (ExtendedBeanMetadata) component;
+                if (bean.getRuntimeClass() != null && AbstractPropertyPlaceholder.class.isAssignableFrom(bean.getRuntimeClass())) {
+                    if (arePropertiesEquals(bean, metadata, "placeholderPrefix")
+                            && arePropertiesEquals(bean, metadata, "placeholderSuffix")) {
+                        if (!arePropertiesEquals(bean, metadata, "systemProperties")
+                                || !arePropertiesEquals(bean, metadata, "ignoreMissingLocations")) {
+                            throw new ComponentDefinitionException("Multiple incompatible placeholders found");
+                        }
+                        // Merge both placeholders
+                        mergeList(bean, metadata, "locations");
+                        mergeMap(bean, metadata, "defaultProperties");
+                        return false;
+                    }
+                }
+            }
+        }
+        return true;
+    }
+
+    private void mergeList(ExtendedBeanMetadata bean1, MutableBeanMetadata bean2, String name) {
+        Metadata m1 = getProperty(bean1, name);
+        Metadata m2 = getProperty(bean2, name);
+        if (m1 == null && m2 != null) {
+            ((MutableBeanMetadata) bean1).addProperty(name, m2);
+        } else if (m1 != null && m2 != null) {
+            if (!(m1 instanceof MutableCollectionMetadata) || !(m2 instanceof MutableCollectionMetadata)) {
+                throw new ComponentDefinitionException("Unable to merge " + name + " list properties");
+            }
+            MutableCollectionMetadata c1 = (MutableCollectionMetadata) m1;
+            MutableCollectionMetadata c2 = (MutableCollectionMetadata) m2;
+            for (Metadata v : c2.getValues()) {
+                c1.addValue(v);
+            }
+        }
+    }
+
+    private void mergeMap(ExtendedBeanMetadata bean1, MutableBeanMetadata bean2, String name) {
+        Metadata m1 = getProperty(bean1, name);
+        Metadata m2 = getProperty(bean2, name);
+        if (m1 == null && m2 != null) {
+            ((MutableBeanMetadata) bean1).addProperty(name, m2);
+        } else if (m1 != null && m2 != null) {
+            if (!(m1 instanceof MutableMapMetadata) || !(m2 instanceof MutableMapMetadata)) {
+                throw new ComponentDefinitionException("Unable to merge " + name + " list properties");
+            }
+            MutableMapMetadata c1 = (MutableMapMetadata) m1;
+            MutableMapMetadata c2 = (MutableMapMetadata) m2;
+            for (MapEntry e : c2.getEntries()) {
+                c1.addEntry(e);
+            }
+        }
+    }
+
+    private boolean arePropertiesEquals(BeanMetadata bean1, BeanMetadata bean2, String name) {
+        String v1 = getPlaceholderProperty(bean1, name);
+        String v2 = getPlaceholderProperty(bean2, name);
+        return v1 == null ? v2 == null : v1.equals(v2);
+    }
+
+    private String getPlaceholderProperty(BeanMetadata bean, String name) {
+        Metadata metadata = getProperty(bean, name);
+        if (metadata instanceof ValueMetadata) {
+            return ((ValueMetadata) metadata).getStringValue();
+        }
+        return null;
+    }
+
+    private Metadata getProperty(BeanMetadata bean, String name) {
+        for (BeanProperty property : bean.getProperties()) {
+            if (name.equals(property.getName())) {
+                return property.getValue();
+            }
+        }
+        return null;
+    }
+
+
     private Metadata parseDefaultProperties(ParserContext context, MutableBeanMetadata enclosingComponent, Element element) {
         MutableMapMetadata props = context.createMetadata(MutableMapMetadata.class);
         NodeList nl = element.getChildNodes();

Modified: aries/trunk/blueprint/blueprint-noosgi/src/test/java/org.apache.aries.blueprint/BlueprintContainerTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-noosgi/src/test/java/org.apache.aries.blueprint/BlueprintContainerTest.java?rev=1461632&r1=1461631&r2=1461632&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-noosgi/src/test/java/org.apache.aries.blueprint/BlueprintContainerTest.java (original)
+++ aries/trunk/blueprint/blueprint-noosgi/src/test/java/org.apache.aries.blueprint/BlueprintContainerTest.java Wed Mar 27 15:07:20 2013
@@ -43,6 +43,21 @@ public class BlueprintContainerTest {
         container.destroy();
     }
 
+    @Test
+    public void testPlaceholders() throws Exception {
+        URL url1 = getClass().getClassLoader().getResource("test.xml");
+        URL url2 = getClass().getClassLoader().getResource("test2.xml");
+        BlueprintContainerImpl container = new BlueprintContainerImpl(getClass().getClassLoader(), Arrays.asList(url1, url2));
+
+        Foo foo = (Foo) container.getComponentInstance("foo");
+        System.out.println(foo);
+        assertNotNull(foo);
+        assertEquals(5, foo.getA());
+        assertEquals(1, foo.getB());
+
+        container.destroy();
+    }
+
     public static void main(String[] args) throws Exception {
         URL url = BlueprintContainerTest.class.getClassLoader().getResource("test.xml");
         BlueprintContainerImpl container = new BlueprintContainerImpl(BlueprintContainerTest.class.getClassLoader(), Arrays.asList(url));

Added: aries/trunk/blueprint/blueprint-noosgi/src/test/resources/test2.xml
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-noosgi/src/test/resources/test2.xml?rev=1461632&view=auto
==============================================================================
--- aries/trunk/blueprint/blueprint-noosgi/src/test/resources/test2.xml (added)
+++ aries/trunk/blueprint/blueprint-noosgi/src/test/resources/test2.xml Wed Mar 27 15:07:20 2013
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+    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.
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.2.0"
+           default-availability="optional">
+
+    <ext:property-placeholder placeholder-prefix="$["
+                              placeholder-suffix="]" ignore-missing-locations="true"
+                              system-properties="override">
+        <ext:default-properties>
+            <ext:property name="c" value="FooBar" />
+        </ext:default-properties>
+    </ext:property-placeholder>
+
+</blueprint>
+