1 package jfun.yan.web; 2 3 import java.io.InputStream ; 4 import javax.servlet.ServletContext ; 5 6 import jfun.util.ClassLoaderUtils; 7 import jfun.yan.Container; 8 import jfun.yan.YanException; 9 import jfun.yan.lifecycle.DefaultLifecycleManager; 10 import jfun.yan.lifecycle.LifecycleManager; 11 import jfun.yan.util.resource.ClassLoader2ResourceLoader; 12 import jfun.yan.util.resource.ResourceLoader; 13 import jfun.yan.xml.NutsProcessor; 14 import jfun.yan.xml.nuts.spring.SpringNuts; 15 21 public class YanLoader { 22 23 28 public static final String CONFIG_FILE_PARAM = "yanConfigFile"; 29 33 public static final String USE_SPRING = "yanSpringIntegration"; 34 38 public static final String TRUE = Boolean.valueOf(true).toString(); 39 42 public static final String DEFAULT_CONFIG_FILE = "/WEB-INF/yan.xml"; 43 46 public static final String SERVLET_CONTEXT_KEY = "jfun.yan.web.ServletContext"; 47 51 public static final String CONTAINER_ROOT = Container.class.getName(); 52 56 public static final String LIFECYCLE_MANAGER_ROOT = LifecycleManager.class.getName(); 57 60 public static final String DEFAULT_NUTS_FILE = "jfun/yan/web/webnuts.xml"; 61 64 public static final String DEFAULT_SPRING_NUTS_FILE = "jfun/yan/web/webspringnuts.xml"; 65 66 private NutsProcessor processor; 67 private Container yan; 68 private DefaultLifecycleManager lifecycle_manager; 69 75 public Container initContainer(ServletContext ctxt){ 76 return initContainer( 77 ClassLoaderUtils.guessClassLoader(getClass().getClassLoader()), 78 ctxt); 79 } 80 83 public synchronized void start() 84 throws Throwable { 85 if(lifecycle_manager!=null) 86 lifecycle_manager.start(); 87 } 88 91 public synchronized void stop()throws Throwable { 92 if(lifecycle_manager != null) 93 lifecycle_manager.stop(); 94 } 95 108 public synchronized Container initContainer(ClassLoader cloader, ServletContext servletContext){ 109 servletContext.log("Loading Nuts container"); 110 if(processor!=null){ 111 throw new IllegalStateException ("YanLoader already initialized."); 112 } 113 try { 114 this.processor = process(cloader, servletContext); 115 if(this.processor==null){ 116 return null; 117 } 118 119 Container parent = loadParentContainer(servletContext); 120 this.yan = parent!=null?processor.getContainer().inherit(parent) 121 : processor.getContainer(); 122 this.lifecycle_manager = processor.getLifecycleManager(); 123 servletContext.setAttribute(CONTAINER_ROOT, this.yan); 124 servletContext.setAttribute(LIFECYCLE_MANAGER_ROOT, this.yan); 125 processor.preInstantiate(this.yan); 126 return this.yan; 127 } 128 catch (RuntimeException ex) { 129 servletContext.log("Container initialization failed", ex); 130 servletContext.setAttribute(CONTAINER_ROOT, ex); 131 throw ex; 132 } 133 catch(Exception e){ 134 servletContext.log("Container initialization failed", e); 135 servletContext.setAttribute(CONTAINER_ROOT, e); 136 throw new YanException(e); 137 } 138 catch (Error err) { 139 servletContext.log("Container initialization error", err); 140 servletContext.setAttribute(CONTAINER_ROOT, err); 141 throw err; 142 } 143 } 144 145 150 protected Container loadParentContainer(ServletContext servletContext) 151 throws Exception { 152 return null; 153 } 154 170 protected NutsProcessor process(ClassLoader cloader, ServletContext ctxt) 171 throws Exception { 172 String config_file = ctxt.getInitParameter(CONFIG_FILE_PARAM); 173 if(config_file==null){ 174 ctxt.log(CONFIG_FILE_PARAM 175 +" not specified, looking for default "+DEFAULT_CONFIG_FILE); 176 config_file = DEFAULT_CONFIG_FILE; 177 } 178 179 final ResourceLoader rloader = new ServletContextResourceLoader(ctxt, 180 new ClassLoader2ResourceLoader(cloader)); 181 final InputStream in = rloader.getResourceAsStream(config_file); 182 if(in == null){ 183 ctxt.log("yan configuration file "+config_file+" not found."); 184 return null; 185 } 186 try{ 187 final NutsProcessor proc = getNutsProcessor(cloader, rloader, ctxt); 188 proc.process(rloader.getResource(config_file), in); 189 registerServletContext(proc.getContainer(), ctxt); 190 return proc; 191 } 192 finally{ 193 in.close(); 194 } 195 } 196 204 protected static void registerServletContext(Container container, ServletContext ctxt){ 205 if(!container.containsType(ServletContext .class)){ 206 if(container.containsKey(WebUtils.DEFAULT_SERVLET_CONTEXT_PROPERTY)){ 207 container.registerValue(ServletContext .class, ctxt); 208 } 209 else{ 210 container.registerValue(WebUtils.DEFAULT_SERVLET_CONTEXT_PROPERTY, ctxt); 211 } 212 } 213 } 214 224 protected NutsProcessor getNutsProcessor(ClassLoader cloader, ResourceLoader rloader, 225 ServletContext ctxt)throws Exception { 226 final NutsProcessor proc = new NutsProcessor(cloader, rloader); 227 decorateProcessor(proc, ctxt); 228 return proc; 229 } 230 253 protected void decorateProcessor(NutsProcessor processor, ServletContext ctxt) 254 throws Exception { 255 processor.registerService(SERVLET_CONTEXT_KEY, ctxt); 256 String spring_integration = ctxt.getInitParameter(USE_SPRING); 257 if(spring_integration!=null && TRUE.equals(spring_integration)){ 258 setSpringAware(processor, ctxt); 259 } 260 else{ 261 setWebAware(processor, ctxt); 262 } 263 } 264 271 protected void setSpringAware(NutsProcessor processor, ServletContext ctxt) 272 throws Exception { 273 SpringNuts.setSpringAware("yan_web_spring", processor, DEFAULT_SPRING_NUTS_FILE); 274 } 275 281 protected void setWebAware(NutsProcessor processor, ServletContext ctxt) 282 throws Exception { 283 processor.loadNutsMetaResource(DEFAULT_NUTS_FILE); 284 } 285 289 public synchronized void destroy(ServletContext servletContext){ 290 if(lifecycle_manager==null) return; 291 servletContext.log("Closing Yan root container"); 292 try{ 293 lifecycle_manager.dispose(); 294 this.lifecycle_manager = null; 295 this.yan = null; 296 this.processor = null; 297 } 298 catch(Error e){ 299 servletContext.log("error in container shutdown", e); 300 throw e; 301 } 302 catch(Throwable e){ 303 servletContext.log("error in container shutdown", e); 304 } 305 } 306 307 } 308 | Popular Tags |