X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=support%2Fgeneral%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fgeneral%2FThreadSpecificProxyFactory.java;h=a5a1cebb3871e8b3334c3ecaabed71fa6232fab3;hb=c7bccc1c2bd936d67835b1eb20e5e9d984a114ce;hp=00856b100e4e1b8cd47db3813aa67ad0e7db3238;hpb=634eacbd658fcc8b587cee0d814cb67983d7ab5b;p=utils diff --git a/support/general/src/main/java/org/wamblee/general/ThreadSpecificProxyFactory.java b/support/general/src/main/java/org/wamblee/general/ThreadSpecificProxyFactory.java index 00856b10..a5a1cebb 100644 --- a/support/general/src/main/java/org/wamblee/general/ThreadSpecificProxyFactory.java +++ b/support/general/src/main/java/org/wamblee/general/ThreadSpecificProxyFactory.java @@ -24,7 +24,8 @@ import java.lang.reflect.Proxy; * Thread-specific proxy is used to create implementations of interfaces that * delegate to a thread-specific implementation of the service. * - * It is used for instance to pass a transaction scoped entity manager around. + * It can be used for instance to create a contextual reference to an entity manager + * that delegates to a thread-specific instance. * * The {@link #set(Object)} method sets the current service instance for the current thread. * The {@link #get()} method gets the current service instance for the current thread. @@ -32,7 +33,7 @@ import java.lang.reflect.Proxy; * instance. The result from this method can be passed at construction of an object that will be used * by multiple threads. * - * This class is mostly used by other test tools. + * This class is mostly used by infrastructure code (utilities) and test tools. * * @param T * Interface to proxy. @@ -53,8 +54,9 @@ public class ThreadSpecificProxyFactory { } } - private ThreadLocal svc = new ThreadLocal(); + private ThreadLocal svc; private Class clazz; + private T proxy; /** * Constructs the factory. @@ -67,7 +69,9 @@ public class ThreadSpecificProxyFactory { throw new IllegalArgumentException("Class " + aClass.getName() + " is not an interface"); } + svc = new ThreadLocal(); clazz = aClass; + proxy = createProxy(); } /** @@ -97,15 +101,19 @@ public class ThreadSpecificProxyFactory { * @return Proxy. */ public T getProxy() { + return proxy; + } + + private T createProxy() { InvocationHandler handler = new ThreadSpecificInvocationHandler(); Class proxyClass = Proxy.getProxyClass(clazz.getClassLoader(), new Class[] { clazz }); - T proxy; + T proxyObj; try { - proxy = (T) proxyClass.getConstructor( + proxyObj = (T) proxyClass.getConstructor( new Class[] { InvocationHandler.class }).newInstance( new Object[] { handler }); - return proxy; + return proxyObj; } catch (Exception e) { throw new RuntimeException("Could not create proxy for " + clazz.getName(), e);