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>