KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > sapia > gumby > tags > script > ProxyTag


1 package org.sapia.gumby.tags.script;
2
3 import java.lang.reflect.InvocationHandler JavaDoc;
4 import java.lang.reflect.Method JavaDoc;
5 import java.lang.reflect.Proxy JavaDoc;
6 import java.util.ArrayList JavaDoc;
7 import java.util.HashMap JavaDoc;
8 import java.util.List JavaDoc;
9 import java.util.Map JavaDoc;
10
11 import org.sapia.gumby.RenderContext;
12 import org.sapia.gumby.factory.ContextAware;
13 import org.sapia.util.xml.confix.ConfigurationException;
14 import org.sapia.util.xml.confix.ObjectCreationCallback;
15
16 /**
17  * @author Yanick Duchesne
18  *
19  * <dl>
20  * <dt><b>Copyright: </b>
21  * <dd>Copyright &#169; 2002-2005 <a HREF="http://www.sapia-oss.org">Sapia Open
22  * Source Software </a>. All Rights Reserved.</dd>
23  * </dt>
24  * <dt><b>License: </b>
25  * <dd>Read the license.txt file of the jar or visit the <a
26  * HREF="http://www.sapia-oss.org/license.html">license page </a> at the Sapia
27  * OSS web site</dd>
28  * </dt>
29  * </dl>
30  */

31 public class ProxyTag implements ContextAware, ObjectCreationCallback {
32
33   private RenderContext _context;
34   private List JavaDoc _implements = new ArrayList JavaDoc();
35   private List JavaDoc _methods = new ArrayList JavaDoc();
36
37   public void addImplements(String JavaDoc intfName) {
38     Class JavaDoc intf = _context.getSettings().resolveClass(intfName);
39     if(intf == null) {
40       throw new IllegalArgumentException JavaDoc("Interface not found: " + intfName);
41     }
42     _implements.add(intf);
43   }
44
45   public MethodTag createMethod() {
46     MethodTag m = new MethodTag();
47     _methods.add(m);
48     return m;
49   }
50
51   /**
52    * @see org.sapia.util.xml.confix.ObjectCreationCallback#onCreate()
53    */

54   public Object JavaDoc onCreate() throws ConfigurationException {
55     Map JavaDoc methods = new HashMap JavaDoc();
56     MethodTag m;
57     for(int i = 0; i < _methods.size(); i++) {
58       m = (MethodTag) _methods.get(i);
59       methods.put(m.getName(), m);
60     }
61
62     Class JavaDoc[] impl = (Class JavaDoc[]) _implements.toArray(new Class JavaDoc[_implements.size()]);
63     return Proxy.newProxyInstance(Thread.currentThread()
64         .getContextClassLoader(), impl, new ProxyHandler(_context, methods));
65   }
66
67   /**
68    * @see org.sapia.gumby.factory.ContextAware#handleContext(org.sapia.gumby.RenderContext)
69    */

70   public void handleContext(RenderContext context) {
71     _context = context;
72   }
73
74   public static class ProxyHandler implements InvocationHandler JavaDoc {
75
76     private RenderContext _context;
77     private Map JavaDoc _methodTags;
78
79     ProxyHandler(RenderContext context, Map JavaDoc methodTags) {
80       _context = context;
81       _methodTags = methodTags;
82     }
83
84     /**
85      * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
86      * java.lang.reflect.Method, java.lang.Object[])
87      */

88     public Object JavaDoc invoke(Object JavaDoc proxy, Method JavaDoc method, Object JavaDoc[] args)
89         throws Throwable JavaDoc {
90       MethodTag m = (MethodTag) _methodTags.get(method.getName());
91       if(m != null) {
92         return m.execute(_context, args);
93       } else {
94         return method.invoke(this, args);
95       }
96     }
97   }
98
99 }
100
Popular Tags