You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by ma...@apache.org on 2010/02/13 00:14:14 UTC

svn commit: r909651 - in /incubator/aries/trunk/blueprint: blueprint-core/src/main/java/org/apache/aries/blueprint/container/ blueprint-testbundlea/src/main/java/org/apache/aries/blueprint/testbundlea/ blueprint-testbundlea/src/main/java/org/apache/ari...

Author: mahrwald
Date: Fri Feb 12 23:14:14 2010
New Revision: 909651

URL: http://svn.apache.org/viewvc?rev=909651&view=rev
Log:
ARIES-159 Use correct classloader for service reference proxying

Added:
    incubator/aries/trunk/blueprint/blueprint-testbundlea/src/main/java/org/apache/aries/blueprint/testbundlea/InterfaceWithDependency.java
    incubator/aries/trunk/blueprint/blueprint-testbundlea/src/main/java/org/apache/aries/blueprint/testbundlea/dependency/
    incubator/aries/trunk/blueprint/blueprint-testbundlea/src/main/java/org/apache/aries/blueprint/testbundlea/dependency/Dependency.java
Modified:
    incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/AbstractServiceReferenceRecipe.java
    incubator/aries/trunk/blueprint/blueprint-testbundleb/src/main/resources/OSGI-INF/blueprint/config.xml

Modified: incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/AbstractServiceReferenceRecipe.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/AbstractServiceReferenceRecipe.java?rev=909651&r1=909650&r2=909651&view=diff
==============================================================================
--- incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/AbstractServiceReferenceRecipe.java (original)
+++ incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/AbstractServiceReferenceRecipe.java Fri Feb 12 23:14:14 2010
@@ -21,6 +21,9 @@
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
+import java.net.URL;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -30,27 +33,28 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.Arrays;
 import java.util.concurrent.Callable;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import net.sf.cglib.proxy.Dispatcher;
 import net.sf.cglib.proxy.Enhancer;
+
 import org.apache.aries.blueprint.BlueprintConstants;
 import org.apache.aries.blueprint.ExtendedBlueprintContainer;
 import org.apache.aries.blueprint.ExtendedServiceReferenceMetadata;
 import org.apache.aries.blueprint.di.AbstractRecipe;
-import org.apache.aries.blueprint.di.Recipe;
 import org.apache.aries.blueprint.di.CollectionRecipe;
+import org.apache.aries.blueprint.di.Recipe;
 import org.apache.aries.blueprint.utils.BundleDelegatingClassLoader;
 import org.apache.aries.blueprint.utils.ReflectionUtils;
+import org.osgi.framework.Bundle;
 import org.osgi.framework.Constants;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceEvent;
 import org.osgi.framework.ServiceListener;
 import org.osgi.framework.ServiceReference;
-import org.osgi.service.blueprint.container.ReifiedType;
 import org.osgi.service.blueprint.container.ComponentDefinitionException;
+import org.osgi.service.blueprint.container.ReifiedType;
 import org.osgi.service.blueprint.reflect.ReferenceListener;
 import org.osgi.service.blueprint.reflect.ReferenceMetadata;
 import org.osgi.service.blueprint.reflect.ServiceReferenceMetadata;
@@ -99,18 +103,67 @@
         this.metadata = metadata;
         this.listenersRecipe = listenersRecipe;
         this.explicitDependencies = explicitDependencies;
-        // Create a ClassLoader delegating to the bundle, but also being able to see our bundle classes
-        // so that the created proxy can access cglib classes.
-        // TODO: use a doPrivileged block
-        // TODO: we should be able to get rid of this classloader when using JDK 1.4 proxies with a single interface
-        //         (the case defined by the spec) and use the interface classloader instead
-        this.proxyClassLoader = new BundleDelegatingClassLoader(blueprintContainer.getBundleContext().getBundle(),
-                                                                getClass().getClassLoader());
+        
+        
+        this.proxyClassLoader = makeProxyClassLoader(blueprintContainer, metadata);
 
         this.optional = (metadata.getAvailability() == ReferenceMetadata.AVAILABILITY_OPTIONAL);
         this.filter = createOsgiFilter(metadata);
     }
 
+
+
+    // Create a ClassLoader delegating to the bundle, but also being able to see our bundle classes
+    // so that the created proxy can access cglib classes.
+    // TODO: we should be able to get rid of this classloader when using JDK 1.4 proxies with a single interface
+    //         (the case defined by the spec) and use the interface classloader instead
+    private ClassLoader makeProxyClassLoader(
+        final ExtendedBlueprintContainer blueprintContainer,
+        ServiceReferenceMetadata metadata) {
+      
+      String typeName = metadata.getInterface();
+      
+      if (typeName == null) {
+        return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
+          public ClassLoader run() {
+            return new BundleDelegatingClassLoader(blueprintContainer.getBundleContext().getBundle(),
+                AbstractServiceReferenceRecipe.class.getClassLoader());
+          }      
+        });
+      }
+      
+      final ClassLoader interfaceClassLoader;
+      try {
+        Bundle clientBundle = blueprintContainer.getBundleContext().getBundle();
+        interfaceClassLoader = clientBundle.loadClass(typeName).getClassLoader();
+      } catch (ClassNotFoundException cnfe) {
+        throw new ComponentDefinitionException("Unable to load class " + typeName + " from recipe " + this, cnfe);
+      }
+      
+      final ClassLoader blueprintClassLoader = AbstractServiceReferenceRecipe.class.getClassLoader();
+      class DualClassloader extends ClassLoader {
+        DualClassloader() {
+          super(interfaceClassLoader);
+        }
+        
+        @Override
+        protected Class<?> findClass(String name) throws ClassNotFoundException {
+          return blueprintClassLoader.loadClass(name);
+        }
+
+        @Override
+        protected URL findResource(String name) {
+          return blueprintClassLoader.getResource(name);
+        }
+      }
+      
+      return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
+        public ClassLoader run() {
+          return new DualClassloader();
+        }      
+      });
+    }
+    
     public CollectionRecipe getListenersRecipe() {
         return listenersRecipe;
     }

Added: incubator/aries/trunk/blueprint/blueprint-testbundlea/src/main/java/org/apache/aries/blueprint/testbundlea/InterfaceWithDependency.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-testbundlea/src/main/java/org/apache/aries/blueprint/testbundlea/InterfaceWithDependency.java?rev=909651&view=auto
==============================================================================
--- incubator/aries/trunk/blueprint/blueprint-testbundlea/src/main/java/org/apache/aries/blueprint/testbundlea/InterfaceWithDependency.java (added)
+++ incubator/aries/trunk/blueprint/blueprint-testbundlea/src/main/java/org/apache/aries/blueprint/testbundlea/InterfaceWithDependency.java Fri Feb 12 23:14:14 2010
@@ -0,0 +1,25 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.aries.blueprint.testbundlea;
+
+import org.apache.aries.blueprint.testbundlea.dependency.Dependency;
+
+public interface InterfaceWithDependency {
+  public void doSomething(Dependency dep);
+}

Added: incubator/aries/trunk/blueprint/blueprint-testbundlea/src/main/java/org/apache/aries/blueprint/testbundlea/dependency/Dependency.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-testbundlea/src/main/java/org/apache/aries/blueprint/testbundlea/dependency/Dependency.java?rev=909651&view=auto
==============================================================================
--- incubator/aries/trunk/blueprint/blueprint-testbundlea/src/main/java/org/apache/aries/blueprint/testbundlea/dependency/Dependency.java (added)
+++ incubator/aries/trunk/blueprint/blueprint-testbundlea/src/main/java/org/apache/aries/blueprint/testbundlea/dependency/Dependency.java Fri Feb 12 23:14:14 2010
@@ -0,0 +1,23 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.aries.blueprint.testbundlea.dependency;
+
+public interface Dependency {
+
+}

Modified: incubator/aries/trunk/blueprint/blueprint-testbundleb/src/main/resources/OSGI-INF/blueprint/config.xml
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-testbundleb/src/main/resources/OSGI-INF/blueprint/config.xml?rev=909651&r1=909650&r2=909651&view=diff
==============================================================================
--- incubator/aries/trunk/blueprint/blueprint-testbundleb/src/main/resources/OSGI-INF/blueprint/config.xml (original)
+++ incubator/aries/trunk/blueprint/blueprint-testbundleb/src/main/resources/OSGI-INF/blueprint/config.xml Fri Feb 12 23:14:14 2010
@@ -58,5 +58,9 @@
   
   <!--  causes injection of a bean processor, which understands this sort of bean.. -->
   <bean id="ProcessedBean" class="org.apache.aries.blueprint.testbundleb.BeanForBeanProcessorTest" three:attribone="true"/>
+  
+  <reference activation="eager" 
+    availability="optional" 
+    interface="org.apache.aries.blueprint.testbundlea.InterfaceWithDependency" />
 </blueprint>