KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > kohsuke > stapler > TearOffSupport


1 package org.kohsuke.stapler;
2
3 import java.lang.reflect.InvocationTargetException JavaDoc;
4 import java.util.HashMap JavaDoc;
5 import java.util.Map JavaDoc;
6
7 /**
8  * Allows "tear-off" objects to be linked to the parent object.
9  *
10  * <p>
11  * This mechanism is used to avoid static linking optional packages,
12  * so that stapler can work even when the optional dependencies are missing.
13  *
14  * @author Kohsuke Kawaguchi
15  */

16 public abstract class TearOffSupport {
17     private volatile Map JavaDoc<Class JavaDoc,Object JavaDoc> tearOffs;
18
19     public final <T> T getTearOff(Class JavaDoc<T> t) {
20         Map JavaDoc<Class JavaDoc,Object JavaDoc> m = tearOffs;
21         if(m==null) return null;
22         return (T)m.get(t);
23     }
24
25     public final <T> T loadTearOff(Class JavaDoc<T> t) {
26         T o = getTearOff(t);
27         if(o==null) {
28             try {
29                 o = t.getConstructor(getClass()).newInstance(this);
30                 setTearOff(t,o);
31             } catch (InstantiationException JavaDoc e) {
32                 throw new InstantiationError JavaDoc(e.getMessage());
33             } catch (IllegalAccessException JavaDoc e) {
34                 throw new IllegalAccessError JavaDoc(e.getMessage());
35             } catch (InvocationTargetException JavaDoc e) {
36                 Throwable JavaDoc ex = e.getTargetException();
37                 if(ex instanceof RuntimeException JavaDoc)
38                     throw (RuntimeException JavaDoc)ex;
39                 if(ex instanceof Error JavaDoc)
40                     throw (Error JavaDoc)ex;
41                 throw new Error JavaDoc(e);
42             } catch (NoSuchMethodException JavaDoc e) {
43                 throw new NoSuchMethodError JavaDoc(e.getMessage());
44             }
45         }
46         return o;
47     }
48
49     public synchronized <T> void setTearOff(Class JavaDoc<T> type, T instance) {
50         Map JavaDoc<Class JavaDoc,Object JavaDoc> m = tearOffs;
51         Map JavaDoc<Class JavaDoc,Object JavaDoc> r = m!=null ? new HashMap JavaDoc<Class JavaDoc, Object JavaDoc>(tearOffs) : new HashMap JavaDoc<Class JavaDoc,Object JavaDoc>();
52         r.put(type,instance);
53         tearOffs = r;
54     }
55 }
56
Popular Tags