[webbeans-commits] Webbeans SVN: r211 - ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/util.

webbeans-commits at lists.jboss.org webbeans-commits at lists.jboss.org
Thu Oct 30 15:40:01 EDT 2008


Author: nickarls
Date: 2008-10-30 15:40:01 -0400 (Thu, 30 Oct 2008)
New Revision: 211

Modified:
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/util/ClientProxyFactory.java
Log:
Superclass/interface detection in proxy generation

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/util/ClientProxyFactory.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/util/ClientProxyFactory.java	2008-10-30 08:02:51 UTC (rev 210)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/util/ClientProxyFactory.java	2008-10-30 19:40:01 UTC (rev 211)
@@ -1,6 +1,10 @@
 package org.jboss.webbeans.util;
 
+import java.io.Serializable;
 import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 import java.util.Set;
 
 import javassist.util.proxy.MethodHandler;
@@ -22,7 +26,9 @@
       this.manager = manager;
    }
    
-   public class ProxyMethodHandler implements MethodHandler {
+   public class ProxyMethodHandler implements MethodHandler, Serializable {
+      private static final long serialVersionUID = -5391564935097267888L;
+
       private ManagerImpl manager;
       private Bean<?> bean;
       
@@ -41,26 +47,44 @@
       }
             
    }
+  
+   private Class<?>[] addSerializableInterface(Class<?> clazz) {
+      Class<?>[] interfaces = Arrays.copyOf(clazz.getInterfaces(), clazz.getInterfaces().length + 1);
+      interfaces[interfaces.length] = Serializable.class;
+      return interfaces;
+   }
    
+   private class TypeInfo {
+      Class<?>[] interfaces;
+      Class<?> superclass;
+   }
+   
+   private TypeInfo getTypeInfo(Set<Class<?>> types) {
+      TypeInfo typeInfo = new TypeInfo();
+      List<Class<?>> interfaces = new ArrayList<Class<?>>();
+      Class<?> superclass = null;
+      for (Class<?> type : types) {
+         if (type.isInterface()) {
+            interfaces.add(type);
+         } else if (superclass == null || (type != Object.class && superclass.isAssignableFrom(type))) {
+            superclass = type;
+         }
+      }
+      interfaces.add(Serializable.class);
+      typeInfo.interfaces = interfaces.toArray(new Class<?>[0]);
+      typeInfo.superclass = superclass;
+      return typeInfo;
+   }
+   
    public <T> T createClientProxy(Bean<T> bean) throws InstantiationException, IllegalAccessException {
       ProxyFactory proxyFactory = new ProxyFactory();
-      // TODO How to get the type T from a bean?
-      Class<?>[] beanTypes = bean.getTypes().toArray(new Class<?>[0]);
-      proxyFactory.setSuperclass(beanTypes[0]);
+      TypeInfo typeInfo = getTypeInfo(bean.getTypes());
+      proxyFactory.setInterfaces(typeInfo.interfaces);
+      proxyFactory.setSuperclass(typeInfo.superclass);
       T clientProxy = (T) proxyFactory.createClass().newInstance();
       ProxyMethodHandler proxyMethodHandler = new ProxyMethodHandler(bean, manager);
       ((ProxyObject)clientProxy).setHandler(proxyMethodHandler);
       return clientProxy;
    }
-   
-   private void run() throws InstantiationException, IllegalAccessException {
-      Bean<Tuna> tunaBean = Util.createSimpleWebBean(Tuna.class, manager);
-      Tuna proxy = createClientProxy(tunaBean);
-   }
-   
-   public static void main(String[] params) throws InstantiationException, IllegalAccessException {
-      ClientProxyFactory f = new ClientProxyFactory(new ManagerImpl());
-      f.run();
-   }   
-      
+        
 }




More information about the weld-commits mailing list