KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > kohsuke > stapler > jelly > JellyClassLoaderTearOff


1 package org.kohsuke.stapler.jelly;
2
3 import org.apache.commons.jelly.JellyContext;
4 import org.apache.commons.jelly.TagLibrary;
5 import org.kohsuke.stapler.MetaClassLoader;
6
7 import java.lang.ref.WeakReference JavaDoc;
8 import java.net.URL JavaDoc;
9 import java.util.HashMap JavaDoc;
10 import java.util.Map JavaDoc;
11
12 /**
13  * {@link MetaClassLoader} tear-off for Jelly support.
14  *
15  * @author Kohsuke Kawaguchi
16  */

17 public class JellyClassLoaderTearOff {
18     private final MetaClassLoader owner;
19
20     /**
21      * See {@link JellyClassTearOff#scripts} for why we use {@link WeakReference} here.
22      */

23     private volatile WeakReference JavaDoc<Map JavaDoc<String JavaDoc,TagLibrary>> taglibs;
24
25     public JellyClassLoaderTearOff(MetaClassLoader owner) {
26         this.owner = owner;
27     }
28
29     public synchronized TagLibrary getTagLibrary(String JavaDoc nsUri) {
30         TagLibrary tl=null;
31
32         if(owner.parent!=null) // parent first
33
tl = owner.parent.loadTearOff(JellyClassLoaderTearOff.class).getTagLibrary(nsUri);
34
35         if(tl!=null)
36             return tl;
37
38         Map JavaDoc<String JavaDoc,TagLibrary> m=null;
39         if(taglibs!=null)
40             m = taglibs.get();
41         if(m==null) {
42             m = new HashMap JavaDoc<String JavaDoc, TagLibrary>();
43             taglibs = new WeakReference JavaDoc<Map JavaDoc<String JavaDoc,TagLibrary>>(m);
44         }
45
46         // then see if it's cached
47
tl = m.get(nsUri);
48
49         if(tl==null) { // can we load them here?
50
String JavaDoc taglibBasePath = trimHeadSlash(nsUri);
51             URL JavaDoc res = owner.loader.getResource(taglibBasePath +"/taglib");
52             if(res!=null) {
53                 tl = new CustomTagLibrary(createContext(),owner.loader,taglibBasePath);
54                 m.put(nsUri,tl);
55             }
56         }
57
58         return tl;
59     }
60
61     private String JavaDoc trimHeadSlash(String JavaDoc nsUri) {
62         if(nsUri.startsWith("/"))
63             return nsUri.substring(1);
64         else
65             return nsUri;
66     }
67
68     /**
69      * Creates {@link JellyContext} for compiling view scripts
70      * for classes in this classloader.
71      */

72     public JellyContext createContext() {
73         JellyContext context = new JellyContext(ROOT_CONTEXT) {
74             public TagLibrary getTagLibrary(String JavaDoc namespaceURI) {
75                 TagLibrary tl = super.getTagLibrary(namespaceURI);
76                 // attempt to resolve nsUri from taglibs
77
if(tl==null) {
78                     tl = JellyClassLoaderTearOff.this.getTagLibrary(namespaceURI);
79                     if(tl!=null)
80                         registerTagLibrary(namespaceURI,tl);
81                 }
82                 return tl;
83             }
84         };
85         context.setExportLibraries(false);
86         return context;
87     }
88
89     /**
90      * Used as the root context for compiling scripts.
91      */

92     private static final JellyContext ROOT_CONTEXT = new JellyContext();
93
94     static {
95         ROOT_CONTEXT.registerTagLibrary("jelly:stapler",new StaplerTagLibrary());
96     }
97 }
98
Popular Tags