1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.backsource.utils.xml;
21 import org.backsource.utils.lang.ClassContextLocal;
22 import org.backsource.utils.lang.InheritableClassContextLocal;
23 /***
24 * Resolver context is a flexible static class to allow setting of EntityResolver and URIResolver when using all the static methods in these utility classes.
25 *
26 * @see org.backsource.utils.lang.ClassContextLocal
27 * @see org.backsource.utils.lang.InheritableClassContextLocal
28 * @author <a href="mailto:pra@tim.se"></a>
29 * @version $Revision: 1.1.1.1 $
30 */
31
32 public class ResolverContext {
33 private static Resolver global= new Resolver();
34 private static InheritableClassContextLocal inheritClassLocal= null;
35 private static ClassContextLocal classLocal = null;
36 private static ThreadLocal threadLocal = null;
37
38 private ResolverContext (){
39
40 }
41 /***
42 * <p>Get a Resolver.
43 *
44 * <p>Does a bottom up search. The order is: threadLocal, classLocal, inheritableClassLocal and last the static global instance of URIFactory.
45 */
46 public static Resolver get() {
47 Resolver fac = null;
48 if (threadLocal != null &&
49 (fac = (Resolver)threadLocal.get()) != null)
50 return fac;
51 else if (classLocal != null &&
52 (fac = (Resolver)classLocal.get()) != null)
53 return fac;
54 else if (inheritClassLocal != null &&
55 (fac = (Resolver)inheritClassLocal.get()) != null)
56 return fac;
57 return global;
58 }
59
60 /***
61 * Set a Resolver available globaly in the JVM.
62 */
63 public static synchronized void set(Resolver factory) {
64 global = factory;
65 }
66
67 /***
68 * Set an Resolver available in the current context class loader it is
69 set and in all its children classloaders.
70 */
71 public static synchronized void setInheritClassLocal(Resolver factory) {
72 if (inheritClassLocal == null)
73 inheritClassLocal = new InheritableClassContextLocal();
74
75 inheritClassLocal.set(factory);
76 }
77
78 /***
79 * Set an Resolver only available in the context classloader it is
80 set.
81 */
82 public static synchronized void setClassLocal(Resolver factory) {
83 if (classLocal == null)
84 classLocal = new ClassContextLocal();
85
86 classLocal.set(factory);
87 }
88
89 /***
90 * Set a Resolver available in the current thread.
91 */
92 public static synchronized void setThreadLocal(Resolver factory) {
93 if (threadLocal == null)
94 threadLocal = new ThreadLocal();
95
96 threadLocal.set(factory);
97 }
98
99 }