You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2012/06/08 16:37:00 UTC

svn commit: r1348091 - /openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBValidatorService.java

Author: rmannibucau
Date: Fri Jun  8 14:36:59 2012
New Revision: 1348091

URL: http://svn.apache.org/viewvc?rev=1348091&view=rev
Log:
more logic to get through cdi a validator

Modified:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBValidatorService.java

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBValidatorService.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBValidatorService.java?rev=1348091&r1=1348090&r2=1348091&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBValidatorService.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBValidatorService.java Fri Jun  8 14:36:59 2012
@@ -18,7 +18,11 @@
 
 package org.apache.openejb.cdi;
 
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
 import org.apache.openejb.OpenEJBRuntimeException;
+import org.apache.openejb.core.ThreadContext;
 import org.apache.webbeans.spi.ValidatorService;
 
 import javax.naming.InitialContext;
@@ -35,7 +39,7 @@ public class OpenEJBValidatorService imp
         try {
             return (ValidatorFactory) new InitialContext().lookup("java:comp/ValidatorFactory");
         } catch (NamingException e) {
-            throw new OpenEJBRuntimeException(e);
+            return proxy(ValidatorFactory.class, "java:comp/ValidatorFactory");
         }
     }
 
@@ -44,7 +48,33 @@ public class OpenEJBValidatorService imp
         try {
             return (Validator) new InitialContext().lookup("java:comp/Validator");
         } catch (NamingException e) {
-            throw new OpenEJBRuntimeException(e);
+            return proxy(Validator.class, "java:comp/Validator");
         }
     }
+
+    // proxy because depending on when injection/threadcontext is set
+    // it is better to do it lazily
+    // this is mainly done for tests since the first lookup will work in TomEE
+    private <T> T proxy(final Class<T> t, final String jndi) {
+        return (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class<?>[] { t },
+                new InvocationHandler() {
+                    @Override
+                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+                        if (Object.class.equals(method.getDeclaringClass())) {
+                            return method.invoke(this);
+                        }
+
+                        final ThreadContext ctx = ThreadContext.getThreadContext();
+                        if (ctx != null) {
+                            return method.invoke((T) ctx.getBeanContext().getJndiContext().lookup(jndi), args);
+                        }
+                        return null;
+                    }
+
+                    @Override
+                    public String toString() {
+                        return "Proxy::" + t.getName();
+                    }
+                });
+    }
 }