You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2011/11/23 21:53:11 UTC

svn commit: r1205586 - in /cxf/branches/2.4.x-fixes: ./ common/common/src/main/java/org/apache/cxf/common/util/ rt/core/src/main/java/org/apache/cxf/bus/blueprint/

Author: dkulp
Date: Wed Nov 23 20:53:10 2011
New Revision: 1205586

URL: http://svn.apache.org/viewvc?rev=1205586&view=rev
Log:
Merged revisions 1205521 via svnmerge from 
https://svn.apache.org/repos/asf/cxf/trunk

........
  r1205521 | dkulp | 2011-11-23 13:16:08 -0500 (Wed, 23 Nov 2011) | 4 lines
  
  Update blueprint to support both Aries blueprint 0.3 and an upcoming
  0.4.1+.   (0.4.0 is not usable)
  When possible, use the ComponentMetadata directly to avoid direct
  dependency on Aries for that.
........

Added:
    cxf/branches/2.4.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/blueprint/BundleDelegatingClassLoader.java
      - copied unchanged from r1205521, cxf/trunk/rt/core/src/main/java/org/apache/cxf/bus/blueprint/BundleDelegatingClassLoader.java
Modified:
    cxf/branches/2.4.x-fixes/   (props changed)
    cxf/branches/2.4.x-fixes/common/common/src/main/java/org/apache/cxf/common/util/ReflectionUtil.java
    cxf/branches/2.4.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/blueprint/BlueprintBeanLocator.java
    cxf/branches/2.4.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/blueprint/BlueprintBus.java
    cxf/branches/2.4.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/blueprint/ConfigurerImpl.java

Propchange: cxf/branches/2.4.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.

Modified: cxf/branches/2.4.x-fixes/common/common/src/main/java/org/apache/cxf/common/util/ReflectionUtil.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.4.x-fixes/common/common/src/main/java/org/apache/cxf/common/util/ReflectionUtil.java?rev=1205586&r1=1205585&r2=1205586&view=diff
==============================================================================
--- cxf/branches/2.4.x-fixes/common/common/src/main/java/org/apache/cxf/common/util/ReflectionUtil.java (original)
+++ cxf/branches/2.4.x-fixes/common/common/src/main/java/org/apache/cxf/common/util/ReflectionUtil.java Wed Nov 23 20:53:10 2011
@@ -28,6 +28,7 @@ import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.net.*;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
@@ -226,4 +227,42 @@ public final class ReflectionUtil {
             return beanInfo.getPropertyDescriptors();
         }
     }
+
+    /**
+     * Try to find a method we can use.   If the object implements a public  
+     * interface that has the public version of that method, we'll use the interface
+     * defined method in case the actual instance class is not public 
+     */
+    public static Method findMethod(Class<?> cls,
+                                    String name,
+                                    Class<?> ... params) {
+        if (cls == null) {
+            return null;
+        }
+        for (Class<?> cs : cls.getInterfaces()) {
+            if (Modifier.isPublic(cs.getModifiers())) {
+                Method m = findMethod(cs, name, params);
+                if (m != null && Modifier.isPublic(m.getModifiers())) {
+                    return m;
+                }
+            }
+        }
+        try {
+            Method m = cls.getDeclaredMethod(name, params);
+            if (m != null && Modifier.isPublic(m.getModifiers())) {
+                return m;
+            }
+        } catch (Exception e) {
+            //ignore
+        }
+        Method m = findMethod(cls.getSuperclass(), name, params);
+        if (m == null) {
+            try {
+                m = cls.getMethod(name, params);
+            } catch (Exception e) {
+                //ignore
+            }
+        }
+        return m;
+    }
 }

Modified: cxf/branches/2.4.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/blueprint/BlueprintBeanLocator.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.4.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/blueprint/BlueprintBeanLocator.java?rev=1205586&r1=1205585&r2=1205586&view=diff
==============================================================================
--- cxf/branches/2.4.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/blueprint/BlueprintBeanLocator.java (original)
+++ cxf/branches/2.4.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/blueprint/BlueprintBeanLocator.java Wed Nov 23 20:53:10 2011
@@ -19,6 +19,7 @@
 
 package org.apache.cxf.bus.blueprint;
 
+import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -27,16 +28,18 @@ import java.util.List;
 import java.util.Set;
 import java.util.logging.Logger;
 
-import org.apache.aries.blueprint.ExtendedBlueprintContainer;
-import org.apache.aries.blueprint.container.BeanRecipe;
-import org.apache.aries.blueprint.di.ExecutionContext;
-import org.apache.aries.blueprint.di.Recipe;
+import org.apache.aries.blueprint.ExtendedBeanMetadata;
 import org.apache.cxf.bus.extension.ExtensionManagerImpl;
 import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.common.util.ReflectionUtil;
 import org.apache.cxf.configuration.ConfiguredBeanLocator;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.blueprint.container.BlueprintContainer;
+import org.osgi.service.blueprint.container.NoSuchComponentException;
+import org.osgi.service.blueprint.reflect.BeanMetadata;
+import org.osgi.service.blueprint.reflect.BeanProperty;
+import org.osgi.service.blueprint.reflect.ComponentMetadata;
 
 /**
  * 
@@ -44,14 +47,14 @@ import org.osgi.service.blueprint.contai
 public class BlueprintBeanLocator implements ConfiguredBeanLocator {
     private static final Logger LOG = LogUtils.getL7dLogger(BlueprintBeanLocator.class);
     ConfiguredBeanLocator orig;
-    ExtendedBlueprintContainer container;
+    BlueprintContainer container;
     BundleContext context;
     
     public BlueprintBeanLocator(ConfiguredBeanLocator orig, 
                                 BlueprintContainer cont, 
                                 BundleContext context) {
         this.orig = orig;
-        this.container = (ExtendedBlueprintContainer)cont;
+        this.container = cont;
         this.context = context;
         if (orig instanceof ExtensionManagerImpl) {
             List<String> names = new ArrayList<String>(container.getComponentIds());
@@ -59,22 +62,54 @@ public class BlueprintBeanLocator implem
         }
     }
     
+    static Class<?> getClassForMetaData(BlueprintContainer container, ComponentMetadata cmd) {
+        Class<?> cls = null;
+        if (cmd instanceof BeanMetadata) {
+            BeanMetadata bm = (BeanMetadata)cmd;
+            if (bm instanceof ExtendedBeanMetadata) {
+                cls = ((ExtendedBeanMetadata)bm).getRuntimeClass();
+            } 
+            if (cls == null) {
+                try {
+                    Method m = ReflectionUtil.findMethod(container.getClass(), "loadClass", String.class);
+                    cls = (Class)ReflectionUtil.setAccessible(m).invoke(container, bm.getClassName());
+                } catch (Exception e) {
+                    //ignore
+                }
+            }
+        }
+        return cls;
+    }
+    private Class<?> getClassForMetaData(ComponentMetadata cmd) {
+        return getClassForMetaData(container, cmd);
+    }
+    private ComponentMetadata getComponentMetadata(String id) {
+        try {
+            return container.getComponentMetadata(id);
+        } catch (NoSuchComponentException nsce) {
+            return null;
+        }
+    }
     
+    public <T> T getBeanOfType(String name, Class<T> type) {
+        
+        ComponentMetadata cmd = getComponentMetadata(name);
+        Class<?> cls = getClassForMetaData(cmd);
+        if (cls != null && type.isAssignableFrom(cls)) {
+            return type.cast(container.getComponentInstance(name));
+        }
+        return orig.getBeanOfType(name, type);
+    }
+
     /** {@inheritDoc}*/
     public List<String> getBeanNamesOfType(Class<?> type) {
         Set<String> names = new LinkedHashSet<String>();
-        ExecutionContext origContext 
-            = ExecutionContext.Holder.setContext((ExecutionContext)container.getRepository());
-        try {
-            for (String s : container.getComponentIds()) {
-                Recipe r = container.getRepository().getRecipe(s);
-                if (r instanceof BeanRecipe && ((BeanRecipe)r).getType() != null
-                    && type.isAssignableFrom(((BeanRecipe)r).getType())) {
-                    names.add(s);
-                }
+        for (String s : container.getComponentIds()) {
+            ComponentMetadata cmd = container.getComponentMetadata(s);
+            Class<?> cls = getClassForMetaData(cmd);
+            if (cls != null && type.isAssignableFrom(cls)) {
+                names.add(s);
             }
-        } finally {
-            ExecutionContext.Holder.setContext(origContext);
         }
         names.addAll(orig.getBeanNamesOfType(type));
         return new ArrayList<String>(names);
@@ -84,19 +119,12 @@ public class BlueprintBeanLocator implem
     public <T> Collection<? extends T> getBeansOfType(Class<T> type) {
         List<T> list = new ArrayList<T>();
         
-        ExecutionContext origContext 
-            = ExecutionContext.Holder.setContext((ExecutionContext)container.getRepository());
-        try {
-            for (String s : container.getComponentIds()) {
-                Recipe r = container.getRepository().getRecipe(s);
-                if (r instanceof BeanRecipe && ((BeanRecipe)r).getType() != null
-                    && type.isAssignableFrom(((BeanRecipe)r).getType())) {
-                    
-                    list.add(type.cast(container.getComponentInstance(s)));
-                } 
+        for (String s : container.getComponentIds()) {
+            ComponentMetadata cmd = container.getComponentMetadata(s);
+            Class<?> cls = getClassForMetaData(cmd);
+            if (cls != null && type.isAssignableFrom(cls)) {
+                list.add(type.cast(container.getComponentInstance(s)));
             }
-        } finally {
-            ExecutionContext.Holder.setContext(origContext);
         }
         list.addAll(orig.getBeansOfType(type));
         if (list.isEmpty()) {
@@ -121,51 +149,39 @@ public class BlueprintBeanLocator implem
     public <T> boolean loadBeansOfType(Class<T> type, BeanLoaderListener<T> listener) {
         List<String> names = new ArrayList<String>();
         boolean loaded = false;
-        ExecutionContext origContext 
-            = ExecutionContext.Holder.setContext((ExecutionContext)container.getRepository());
-        try {
-            for (String s : container.getComponentIds()) {
-                Recipe r = container.getRepository().getRecipe(s);
-                if (r instanceof BeanRecipe && ((BeanRecipe)r).getType() != null
-                    && type.isAssignableFrom(((BeanRecipe)r).getType())) {
-                    names.add(s);
+        for (String s : container.getComponentIds()) {
+            ComponentMetadata cmd = container.getComponentMetadata(s);
+            Class<?> cls = getClassForMetaData(cmd);
+            if (cls != null && type.isAssignableFrom(cls)) {
+                names.add(s);
+            }
+        }
+        Collections.reverse(names);
+        for (String s : names) {
+            ComponentMetadata cmd = container.getComponentMetadata(s);
+            Class<?> beanType = getClassForMetaData(cmd);
+            Class<? extends T> t = beanType.asSubclass(type);
+            if (listener.loadBean(s, t)) {
+                Object o = container.getComponentInstance(s);
+                if (listener.beanLoaded(s, type.cast(o))) {
+                    return true;
                 }
+                loaded = true;
             }
-            Collections.reverse(names);
-            for (String s : names) {
-                BeanRecipe r = (BeanRecipe)container.getRepository().getRecipe(s);
-                Class<?> beanType = r.getType();
-                Class<? extends T> t = beanType.asSubclass(type);
-                if (listener.loadBean(s, t)) {
-                    Object o = container.getComponentInstance(s);
-                    if (listener.beanLoaded(s, type.cast(o))) {
-                        return true;
-                    }
-                    loaded = true;
-                }
-            }
-        } finally {
-            ExecutionContext.Holder.setContext(origContext);
         }
         return loaded || orig.loadBeansOfType(type, listener);
     }
 
     public boolean hasConfiguredPropertyValue(String beanName, String propertyName, String value) {
-        ExecutionContext origContext 
-            = ExecutionContext.Holder.setContext((ExecutionContext)container.getRepository());
-        try {
-            Recipe r = container.getRepository().getRecipe(beanName);
-            if (r instanceof BeanRecipe) {
-                BeanRecipe br = (BeanRecipe)r;
-                Object o = br.getProperty(propertyName);
-                if (o == null) {
-                    return false;
+        ComponentMetadata cmd = getComponentMetadata(beanName);
+        if (cmd instanceof BeanMetadata) {
+            BeanMetadata br = (BeanMetadata)cmd;
+            for (BeanProperty s : br.getProperties()) {
+                if (propertyName.equals(s.getName())) {
+                    return true;
                 }
-                //TODO - need to check the values of the property
-                return false;
             }
-        } finally {
-            ExecutionContext.Holder.setContext(origContext);
+            return false;
         }
         return orig.hasConfiguredPropertyValue(beanName, propertyName, value);
     }

Modified: cxf/branches/2.4.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/blueprint/BlueprintBus.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.4.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/blueprint/BlueprintBus.java?rev=1205586&r1=1205585&r2=1205586&view=diff
==============================================================================
--- cxf/branches/2.4.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/blueprint/BlueprintBus.java (original)
+++ cxf/branches/2.4.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/blueprint/BlueprintBus.java Wed Nov 23 20:53:10 2011
@@ -20,7 +20,6 @@
 package org.apache.cxf.bus.blueprint;
 
 
-import org.apache.aries.blueprint.utils.BundleDelegatingClassLoader;
 import org.apache.cxf.bus.extension.ExtensionManagerBus;
 import org.apache.cxf.configuration.ConfiguredBeanLocator;
 import org.apache.cxf.configuration.Configurer;

Modified: cxf/branches/2.4.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/blueprint/ConfigurerImpl.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.4.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/blueprint/ConfigurerImpl.java?rev=1205586&r1=1205585&r2=1205586&view=diff
==============================================================================
--- cxf/branches/2.4.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/blueprint/ConfigurerImpl.java (original)
+++ cxf/branches/2.4.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/blueprint/ConfigurerImpl.java Wed Nov 23 20:53:10 2011
@@ -19,6 +19,7 @@
 
 package org.apache.cxf.bus.blueprint;
 
+import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -29,20 +30,21 @@ import java.util.logging.Logger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import org.apache.aries.blueprint.ExtendedBlueprintContainer;
-import org.apache.aries.blueprint.container.BeanRecipe;
-import org.apache.aries.blueprint.di.Recipe;
 import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.common.util.ReflectionUtil;
 import org.apache.cxf.configuration.Configurable;
 import org.apache.cxf.configuration.Configurer;
 import org.osgi.service.blueprint.container.BlueprintContainer;
+import org.osgi.service.blueprint.container.NoSuchComponentException;
+import org.osgi.service.blueprint.reflect.BeanMetadata;
+import org.osgi.service.blueprint.reflect.ComponentMetadata;
 
 /**
  * 
  */
 public class ConfigurerImpl implements Configurer {
     private static final Logger LOG = LogUtils.getL7dLogger(ConfigurerImpl.class);
-    ExtendedBlueprintContainer container;
+    BlueprintContainer container;
     
     private final Map<String, List<MatcherHolder>> wildCardBeanDefinitions
         = new HashMap<String, List<MatcherHolder>>();
@@ -58,7 +60,7 @@ public class ConfigurerImpl implements C
     
     
     public ConfigurerImpl(BlueprintContainer con) {
-        container = (ExtendedBlueprintContainer)con;
+        container = con;
         initializeWildcardMap();
     }
     private boolean isWildcardBeanName(String bn) {
@@ -69,19 +71,19 @@ public class ConfigurerImpl implements C
     private void initializeWildcardMap() {
         for (String s : container.getComponentIds()) {
             if (isWildcardBeanName(s)) {
-                Recipe r = container.getRepository().getRecipe(s);
-                if (r instanceof BeanRecipe) {
-                    Class c = ((BeanRecipe)r).getType();
+                ComponentMetadata cmd = container.getComponentMetadata(s);
+                Class<?> cls = BlueprintBeanLocator.getClassForMetaData(container, cmd);
+                if (cls != null) {
                     String orig = s;
                     if (s.charAt(0) == '*') {
                         //old wildcard
                         s = "." + s.replaceAll("\\.", "\\."); 
                     }
                     Matcher matcher = Pattern.compile(s).matcher("");
-                    List<MatcherHolder> m = wildCardBeanDefinitions.get(c.getName());
+                    List<MatcherHolder> m = wildCardBeanDefinitions.get(cls.getName());
                     if (m == null) {
                         m = new ArrayList<MatcherHolder>();
-                        wildCardBeanDefinitions.put(c.getName(), m);
+                        wildCardBeanDefinitions.put(cls.getName(), m);
                     }
                     MatcherHolder holder = new MatcherHolder(orig, matcher);
                     m.add(holder);
@@ -109,9 +111,42 @@ public class ConfigurerImpl implements C
             configureWithWildCard(bn, beanInstance);
         }
         
-        Recipe r = container.getRepository().getRecipe(bn);
-        if (r instanceof BeanRecipe) {
-            ((BeanRecipe)r).setProperties(beanInstance);
+        
+        Method m = ReflectionUtil.findMethod(container.getClass(), "injectBeanInstance",
+                                             BeanMetadata.class, Object.class);
+        try {
+            if (m != null) {
+                //Aries blueprint 0.4.1+
+                ComponentMetadata cm = null;
+                try {
+                    cm = container.getComponentMetadata(bn);
+                } catch (NoSuchComponentException nsce) {
+                    cm = null;
+                }
+                if (cm instanceof BeanMetadata) {
+                    ReflectionUtil.setAccessible(m);
+                    m.invoke(container, (BeanMetadata)cm, beanInstance);
+                }
+            } else {
+                //Aries blueprint 0.3.x
+                m = ReflectionUtil.findMethod(container.getClass(), "getRepository");
+                Object o = ReflectionUtil.setAccessible(m).invoke(container);
+                m = ReflectionUtil.findMethod(container.getClass(), "getRecipe", String.class);
+                o = ReflectionUtil.setAccessible(m).invoke(o, bn);  //returns the recipe
+                m = ReflectionUtil.findMethod(o.getClass(), "setProperties", Object.class);
+                if (m != null) {
+                    ReflectionUtil.setAccessible(m).invoke(o, beanInstance);
+                }
+            }
+        } catch (InvocationTargetException ite) {
+            Throwable t = ite.getCause();
+            if (t instanceof RuntimeException) {
+                throw (RuntimeException)t;
+            } else {
+                throw new RuntimeException(t);
+            }
+        } catch (Exception ex) {
+            LOG.log(Level.FINE, "Could not configure object " + bn, ex);
         }
     }
     private void configureWithWildCard(String bn, Object beanInstance) {