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 2013/02/26 17:19:32 UTC
svn commit: r1450255 -
/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/bval/ValidatorUtil.java
Author: rmannibucau
Date: Tue Feb 26 16:19:32 2013
New Revision: 1450255
URL: http://svn.apache.org/r1450255
Log:
OPENEJB-2003 try to find a validator in embedded mode even if the lookup fails
Modified:
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/bval/ValidatorUtil.java
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/bval/ValidatorUtil.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/bval/ValidatorUtil.java?rev=1450255&r1=1450254&r2=1450255&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/bval/ValidatorUtil.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/bval/ValidatorUtil.java Tue Feb 26 16:19:32 2013
@@ -16,19 +16,28 @@
*/
package org.apache.openejb.bval;
+import org.apache.openejb.AppContext;
+import org.apache.openejb.BeanContext;
+import org.apache.openejb.assembler.classic.Assembler;
import org.apache.openejb.core.ThreadContext;
+import org.apache.openejb.core.WebContext;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.spi.ContainerSystem;
import javax.naming.InitialContext;
+import javax.naming.NameNotFoundException;
import javax.naming.NamingException;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
+import java.util.ArrayList;
+import java.util.Collection;
public final class ValidatorUtil {
private ValidatorUtil() {
- // no-op
+ // no-op
}
public static ValidatorFactory validatorFactory() {
@@ -51,7 +60,7 @@ public final class ValidatorUtil {
// it is better to do it lazily
// this is mainly done for tests since the first lookup will work in TomEE
private static <T> T proxy(final Class<T> t, final String jndi) {
- return (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class<?>[]{t},
+ return t.cast(Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class<?>[]{t},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
@@ -61,8 +70,60 @@ public final class ValidatorUtil {
final ThreadContext ctx = ThreadContext.getThreadContext();
if (ctx != null) {
- return method.invoke((T) ctx.getBeanContext().getJndiContext().lookup(jndi), args);
+ return method.invoke(ctx.getBeanContext().getJndiContext().lookup(jndi), args);
}
+
+ // try to find from current ClassLoader
+ // can lead to find the bad validator regarding module separation
+ // but since it shares the same classloader
+ // it will probably share the same config
+ // so the behavior will be the same
+ // + this code should rarely be used
+ final ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+ final ContainerSystem containerSystem = SystemInstance.get().getComponent(ContainerSystem.class);
+
+ Object value = null;
+ for (final AppContext appContext : containerSystem.getAppContexts()) {
+ if (appContext.getClassLoader().equals(tccl)) {
+ final Collection<String> tested = new ArrayList<String>();
+ for (final BeanContext bean : appContext.getBeanContexts()) {
+ if (BeanContext.Comp.class.equals(bean.getBeanClass())) {
+ final String uniqueId = bean.getModuleContext().getUniqueId();
+ if (tested.contains(uniqueId)) {
+ continue;
+ }
+
+ tested.add(uniqueId);
+
+ try {
+ value = containerSystem.getJNDIContext().lookup(
+ (jndi.endsWith("Factory") ?
+ Assembler.VALIDATOR_FACTORY_NAMING_CONTEXT
+ : Assembler.VALIDATOR_NAMING_CONTEXT)
+ + uniqueId);
+ break;
+ } catch (final NameNotFoundException nnfe) {
+ // no-op
+ }
+ }
+ }
+ break;
+ }
+ for (final WebContext web : appContext.getWebContexts()) {
+ if (web.getClassLoader().equals(tccl)) {
+ value = web.getJndiEnc().lookup(jndi);
+ break;
+ }
+ }
+ if (value != null) {
+ break;
+ }
+ }
+
+ if (value != null) {
+ return method.invoke(value, args);
+ }
+
return null;
}
@@ -70,6 +131,6 @@ public final class ValidatorUtil {
public String toString() {
return "Proxy::" + t.getName();
}
- });
+ }));
}
}