You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ga...@apache.org on 2010/05/05 17:19:45 UTC
svn commit: r941340 - in
/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel:
basic/BasicProxyManager.java classloader/DelegatingClassLoader.java
Author: gawor
Date: Wed May 5 15:19:44 2010
New Revision: 941340
URL: http://svn.apache.org/viewvc?rev=941340&view=rev
Log:
GERONIMO-5279: An attempt at making gbean proxies work. The remote operations like install-library seems to be working now
Added:
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/DelegatingClassLoader.java (with props)
Modified:
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/basic/BasicProxyManager.java
Modified: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/basic/BasicProxyManager.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/basic/BasicProxyManager.java?rev=941340&r1=941339&r2=941340&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/basic/BasicProxyManager.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/basic/BasicProxyManager.java Wed May 5 15:19:44 2010
@@ -27,6 +27,7 @@ import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.reflect.FastClass;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.geronimo.gbean.AbstractName;
@@ -34,6 +35,7 @@ import org.apache.geronimo.gbean.GBeanIn
import org.apache.geronimo.kernel.ClassLoading;
import org.apache.geronimo.kernel.GBeanNotFoundException;
import org.apache.geronimo.kernel.Kernel;
+import org.apache.geronimo.kernel.classloader.DelegatingClassLoader;
import org.apache.geronimo.kernel.proxy.ProxyCreationException;
import org.apache.geronimo.kernel.proxy.ProxyFactory;
import org.apache.geronimo.kernel.proxy.ProxyManager;
@@ -85,44 +87,48 @@ public class BasicProxyManager implement
try {
// if the type is visible from the target's classloader use it
// otherwise use the type's classloader
- //TODO OSGI BUSTED
- ClassLoader classLoader = null;
- try {
-// classLoader = kernel.getBundlerFor(target);
- if (!type.equals(ClassLoading.loadClass(type.getName(), classLoader))) {
- classLoader = type.getClassLoader();
- }
- } catch (Exception ignored) {
- classLoader = type.getClassLoader();
- }
-
+ ClassLoader classLoader = type.getClassLoader();
+
// add any interface exposed by the gbean that is visible from the selected class loader
- List types = getVisibleInterfaces(target, classLoader, true);
- if (types == null) types = new ArrayList();
+ List<Class> types = getVisibleInterfaces(target, classLoader, true);
+ if (types == null) {
+ types = new ArrayList<Class>();
+ }
types.add(type);
- return (T) createProxyFactory((Class[]) types.toArray(new Class[types.size()]), classLoader).createProxy(target);
+ DelegatingClassLoader proxyClassLoader = new DelegatingClassLoader();
+ proxyClassLoader.addLoader(classLoader);
+ proxyClassLoader.addLoader(getClass()); // to be able to load GeronimoManagedBean
+
+ return (T) createProxyFactory((Class[]) types.toArray(new Class[types.size()]), proxyClassLoader).createProxy(target);
} catch (GBeanNotFoundException e) {
throw new IllegalArgumentException("Could not get GBeanInfo for target object: " + target, e);
}
}
-
+
public Object createProxy(AbstractName target, ClassLoader classLoader) {
if (target == null) throw new NullPointerException("target is null");
if (classLoader == null) throw new NullPointerException("classLoader is null");
try {
- List types = getVisibleInterfaces(target, classLoader, true);
- if (types == null) return null;
- return createProxyFactory((Class[]) types.toArray(new Class[types.size()]), classLoader).createProxy(target);
+ List<Class> types = getVisibleInterfaces(target, classLoader, true);
+ if (types == null) {
+ return null;
+ }
+
+ DelegatingClassLoader proxyClassLoader = new DelegatingClassLoader();
+ proxyClassLoader.addLoader(classLoader);
+ proxyClassLoader.addLoader(getClass()); // to be able to load GeronimoManagedBean
+
+ return createProxyFactory((Class[]) types.toArray(new Class[types.size()]), proxyClassLoader).createProxy(target);
} catch (GBeanNotFoundException e) {
throw new IllegalArgumentException("Could not get GBeanInfo for target object: " + target, e);
}
}
- private List getVisibleInterfaces(AbstractName target, ClassLoader classLoader, boolean shouldLog) throws GBeanNotFoundException {
+ private List<Class> getVisibleInterfaces(AbstractName target, ClassLoader classLoader, boolean shouldLog) throws GBeanNotFoundException {
GBeanInfo info = kernel.getGBeanInfo(target);
- Set interfaces = info.getInterfaces();
+ Set<String> interfaces = info.getInterfaces();
if(interfaces.size() == 0) {
if (shouldLog) {
log.warn("No interfaces found for " + target + " ("+target+")");
@@ -130,10 +136,10 @@ public class BasicProxyManager implement
return null;
}
String[] names = (String[]) interfaces.toArray(new String[0]);
- List types = new ArrayList();
+ List<Class> types = new ArrayList<Class>();
for (int i = 0; i < names.length; i++) {
try {
- Class type = classLoader.loadClass(names[i]);
+ Class<?> type = classLoader.loadClass(names[i]);
if (type.isInterface()) {
types.add(type);
}
Added: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/DelegatingClassLoader.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/DelegatingClassLoader.java?rev=941340&view=auto
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/DelegatingClassLoader.java (added)
+++ geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/DelegatingClassLoader.java Wed May 5 15:19:44 2010
@@ -0,0 +1,77 @@
+/**
+* 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.geronimo.kernel.classloader;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * ClassLoader implementation that delegates calls to multiple classloaders.
+ */
+public class DelegatingClassLoader extends ClassLoader {
+
+ private Set<ClassLoader> loaders = new LinkedHashSet<ClassLoader>();
+
+ public void addLoader(ClassLoader loader) {
+ loaders.add(loader);
+ }
+
+ public void addLoader(Class<?> clazz) {
+ loaders.add(clazz.getClassLoader());
+ }
+
+ @Override
+ public Class<?> findClass(String name) throws ClassNotFoundException {
+ for (ClassLoader loader : loaders) {
+ try {
+ return loader.loadClass(name);
+ } catch (ClassNotFoundException cnfe) {
+ // Try next
+ }
+ }
+ throw new ClassNotFoundException(name);
+ }
+
+ @Override
+ public URL getResource(String name) {
+ for (ClassLoader loader : loaders) {
+ URL url = loader.getResource(name);
+ if (url != null) {
+ return url;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public Enumeration<URL> getResources(String name) throws IOException {
+ List<URL> resources = new ArrayList<URL>();
+ for (ClassLoader loader : loaders) {
+ Enumeration<URL> e = loader.getResources(name);
+ while (e.hasMoreElements()) {
+ resources.add(e.nextElement());
+ }
+ }
+ return Collections.enumeration(resources);
+ }
+}
Propchange: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/DelegatingClassLoader.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/DelegatingClassLoader.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/classloader/DelegatingClassLoader.java
------------------------------------------------------------------------------
svn:mime-type = text/plain