- /**
- * We store a map of unique ids of invocation handlers to thread local storage of the
- * service. In this way, serialiability of the generated proxy is obtained (required by
- * framweorks such as wicket). Also, different factories will still be separate and never
- * use the same threadlocal storage.
- */
- private static Map<String,ThreadLocal> STORAGE =
- initializeThreadLocal();
-
- private static class ThreadSpecificInvocationHandler<T> implements InvocationHandler, Serializable {
-
- private String id;
- private Class clazz;
-
- public ThreadSpecificInvocationHandler(String aId, Class aClass) {
- id = aId;
- clazz = aClass;
- }
-
- @Override
- public Object invoke(Object aProxy, Method aMethod, Object[] aArgs)
- throws Throwable {
- ThreadLocal<T> local = STORAGE.get(id);
- T actualSvc = local.get();
- if ( aMethod.getName().equals("toString") && actualSvc == null) {
- return "Thread-specific proxy for '" + clazz.getName() + "'";
- }
- try {
- return aMethod.invoke(actualSvc, aArgs);
- } catch (InvocationTargetException e) {
- throw e.getCause();
- }
- }
- }
-