📄 dspextendlet.java
字号:
/* DspExtendlet.java{{IS_NOTE Purpose: Description: History: Wed Jul 4 15:57:24 2007, Created by tomyeh}}IS_NOTECopyright (C) 2007 Potix Corporation. All Rights Reserved.{{IS_RIGHT This program is distributed under GPL Version 2.0 in the hope that it will be useful, but WITHOUT ANY WARRANTY.}}IS_RIGHT*/package org.zkoss.web.util.resource;import java.io.InputStream;import java.io.InputStreamReader;import java.io.Writer;import java.io.StringWriter;import java.io.OutputStream;import java.io.IOException;import javax.servlet.ServletRequest;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.zkoss.lang.D;import org.zkoss.lang.Exceptions;import org.zkoss.io.Files;import org.zkoss.util.logging.Log;import org.zkoss.util.resource.ResourceCache;import org.zkoss.util.resource.Loader;import org.zkoss.web.servlet.Servlets;import org.zkoss.web.servlet.http.Https;import org.zkoss.web.servlet.dsp.Interpreter;import org.zkoss.web.servlet.dsp.Interpretation;import org.zkoss.web.servlet.dsp.ServletDspContext;/** * The DSP resource processor ({@link Extendlet}) used to parse * DSP files loaded from the classpath. * * @author tomyeh * @since 2.4.1 *//*package*/ class DspExtendlet implements Extendlet { private static final Log log = Log.lookup(DspExtendlet.class); private ExtendletContext _webctx; /** DSP Interpretation cache. */ private ResourceCache _cache; public void init(ExtendletConfig config) { _webctx = config.getExtendletContext(); _cache = new ResourceCache(new DSPLoader(), 131); _cache.setMaxSize(1024); _cache.setLifetime(60*60*1000); //1hr _cache.setCheckPeriod(60*60*1000); //1hr } public void service(HttpServletRequest request, HttpServletResponse response, String path, String extra) throws ServletException, IOException { final Interpretation cnt = (Interpretation)_cache.get(path); if (cnt == null) { if (Servlets.isIncluded(request)) log.error("Failed to load the resource: "+path); //It might be eaten, so log the error response.sendError(response.SC_NOT_FOUND, path); return; } StringWriter sw = _webctx.shallCompress(request, get2ndExtension(path)) ? new StringWriter(4096): null; cnt.interpret(new ServletDspContext( _webctx.getServletContext(), request, response, sw, _webctx.getLocator())); if (extra != null) (sw != null ? (Writer)sw: response.getWriter()).write(extra); if (sw != null) { final String result = sw.toString(); sw = null; //free try { final OutputStream os = response.getOutputStream(); //Call it first to ensure getWrite() is not called yet byte[] data = result.getBytes("UTF-8"); if (data.length > 200) { byte[] bs = Https.gzip(request, response, null, data); if (bs != null) data = bs; //yes, browser support compress } response.setContentLength(data.length); os.write(data); } catch (IllegalStateException ex) { //getWriter is called response.getWriter().write(result); } response.flushBuffer(); } return; //done } /** Returns the second extension. For example, js in xx.js.dsp. */ private static final String get2ndExtension(String path) { int j = path.lastIndexOf('.'); if (j < 0 || path.indexOf('/', j + 1) >= 0) return null; int k = j > 0 ? path.lastIndexOf('.', j - 1): -1; if (k < 0 || path.indexOf('/', k + 1) >= 0) return null; return path.substring(k + 1, j).toLowerCase(); } /** Helper class. */ private class DSPLoader implements Loader { private DSPLoader() { } //-- super --// public boolean shallCheck(Object src, long expiredMillis) { return expiredMillis > 0; } /** Returns the last modified time. */ public long getLastModified(Object src) { return 1; //any value (because it is packed in jar) } public Object load(Object src) throws Exception {// if (D.ON && log.debugable()) log.debug("Parse "+src); final String path = (String)src; final InputStream is = _webctx.getResourceAsStream(path); if (is == null) return null; try { return parse0(is, Interpreter.getContentType(path)); } catch (Exception ex) { if (log.debugable()) log.realCauseBriefly("Failed to parse "+path, ex); else log.error("Failed to parse "+path +"\nCause: "+ex.getClass().getName()+" "+Exceptions.getMessage(ex) +"\n"+Exceptions.getBriefStackTrace(ex)); return null; //as non-existent } } private Object parse0(InputStream is, String ctype) throws Exception { final String content = Files.readAll(new InputStreamReader(is, "UTF-8")) .toString(); return new Interpreter() .parse(content, ctype, null, _webctx.getLocator()); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -