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 ; 8 import java.net.URL ; 9 import java.util.HashMap ; 10 import java.util.Map ; 11 12 17 public class JellyClassLoaderTearOff { 18 private final MetaClassLoader owner; 19 20 23 private volatile WeakReference <Map <String ,TagLibrary>> taglibs; 24 25 public JellyClassLoaderTearOff(MetaClassLoader owner) { 26 this.owner = owner; 27 } 28 29 public synchronized TagLibrary getTagLibrary(String nsUri) { 30 TagLibrary tl=null; 31 32 if(owner.parent!=null) tl = owner.parent.loadTearOff(JellyClassLoaderTearOff.class).getTagLibrary(nsUri); 34 35 if(tl!=null) 36 return tl; 37 38 Map <String ,TagLibrary> m=null; 39 if(taglibs!=null) 40 m = taglibs.get(); 41 if(m==null) { 42 m = new HashMap <String , TagLibrary>(); 43 taglibs = new WeakReference <Map <String ,TagLibrary>>(m); 44 } 45 46 tl = m.get(nsUri); 48 49 if(tl==null) { String taglibBasePath = trimHeadSlash(nsUri); 51 URL 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 trimHeadSlash(String nsUri) { 62 if(nsUri.startsWith("/")) 63 return nsUri.substring(1); 64 else 65 return nsUri; 66 } 67 68 72 public JellyContext createContext() { 73 JellyContext context = new JellyContext(ROOT_CONTEXT) { 74 public TagLibrary getTagLibrary(String namespaceURI) { 75 TagLibrary tl = super.getTagLibrary(namespaceURI); 76 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 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 |