[jboss-cvs] JBossAS SVN: r58295 - projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Nov 13 08:38:24 EST 2006


Author: kabir.khan at jboss.com
Date: 2006-11-13 08:38:21 -0500 (Mon, 13 Nov 2006)
New Revision: 58295

Modified:
   projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ContainerProxyFactory.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ProxyTemplate.java
Log:
[JBAOP-306] Fix NPE for ctors calling methods causes NPE when using AOP/MC proxies

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ContainerProxyFactory.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ContainerProxyFactory.java	2006-11-13 13:34:57 UTC (rev 58294)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ContainerProxyFactory.java	2006-11-13 13:38:21 UTC (rev 58295)
@@ -50,7 +50,6 @@
 import org.jboss.aop.MethodInfo;
 import org.jboss.aop.instrument.TransformerCommon;
 import org.jboss.aop.introduction.InterfaceIntroduction;
-import org.jboss.aop.metadata.SimpleMetaData;
 import org.jboss.aop.util.JavassistMethodHashing;
 
 
@@ -209,6 +208,7 @@
          proxy.addInterface(interfaze);
       }
       
+      addFieldFromTemplate(template, "_proxy_initialised");
       ensureDefaultConstructor(superclass, proxy);
       addFieldFromTemplate(template, "mixins");
 
@@ -358,29 +358,43 @@
                superCall.append(", ");
             }
             
-            if (!params[i].isPrimitive())
-            {
-               superCall.append("null");
-            }
-            else
-            {
-               if (params[i].equals(CtClass.booleanType)) superCall.append("false");
-               else if (params[i].equals(CtClass.charType)) superCall.append("'0'");
-               else if (params[i].equals(CtClass.byteType)) superCall.append("0");
-               else if (params[i].equals(CtClass.shortType)) superCall.append("0");
-               else if (params[i].equals(CtClass.intType)) superCall.append("0");
-               else if (params[i].equals(CtClass.longType)) superCall.append("0L");
-               else if (params[i].equals(CtClass.floatType)) superCall.append("0f");
-               else if (params[i].equals(CtClass.doubleType)) superCall.append("0d");               
-            }
+            superCall.append(getNullType(params[i]));
          }
          
          superCall.append(");");
+         superCall.append("_proxy_initialised = true;");
          
          CtConstructor ctor = CtNewConstructor.make(EMPTY_CTCLASS_ARRAY, EMPTY_CTCLASS_ARRAY, "{" + superCall.toString() + "}", proxy);
          proxy.addConstructor(ctor);
       }
+      else
+      {
+         CtConstructor ctor = CtNewConstructor.defaultConstructor(proxy);
+         ctor.setBody("{_proxy_initialised = true;}");
+         proxy.addConstructor(ctor);
+      }
    }
+
+   private String getNullType(CtClass clazz)
+   {
+      if (!clazz.isPrimitive())
+      {
+         return "null";
+      }
+      else
+      {
+         if (clazz.equals(CtClass.booleanType)) return "false";
+         else if (clazz.equals(CtClass.charType)) return "'0'";
+         else if (clazz.equals(CtClass.byteType)) return "0";
+         else if (clazz.equals(CtClass.shortType)) return "0";
+         else if (clazz.equals(CtClass.intType)) return "0";
+         else if (clazz.equals(CtClass.longType)) return "0L";
+         else if (clazz.equals(CtClass.floatType)) return "0f";
+         else if (clazz.equals(CtClass.doubleType)) return "0d";
+         else return "";//void
+      }
+      
+   }
    
    private void addMethodsAndMixins()throws Exception
    {
@@ -550,6 +564,9 @@
          
          if (m.getParameterTypes().length > 0) args = "$args";
          String code = "{   " +
+                       "    if (_proxy_initialised == false) {" +
+                       "       return " + getNullType(m.getReturnType()) + ";" +
+                       "    }" +
                        "    try{" +
                        "       org.jboss.aop.MethodInfo mi = currentAdvisor.getMethodInfo(" + hash.longValue() + "L); " +
                        "       if (mi == null) " +

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ProxyTemplate.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ProxyTemplate.java	2006-11-13 13:34:57 UTC (rev 58294)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/proxy/container/ProxyTemplate.java	2006-11-13 13:38:21 UTC (rev 58295)
@@ -42,6 +42,7 @@
    private transient Advisor classAdvisor;
    private transient InstanceAdvisor instanceAdvisor;
    protected volatile transient Advisor currentAdvisor;
+   protected boolean _proxy_initialised;
    
    private Object delegate;
    private Object[] mixins; // Do not remove this




More information about the jboss-cvs-commits mailing list