pagemanager.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 442 行
JAVA
442 行
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * * Free Software Foundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */package com.caucho.jsp;import com.caucho.config.ConfigContext;import com.caucho.config.j2ee.InjectIntrospector;import com.caucho.config.program.ConfigProgram;import com.caucho.java.JavaCompiler;import com.caucho.jsp.cfg.JspPropertyGroup;import com.caucho.loader.Environment;import com.caucho.server.util.CauchoSystem;import com.caucho.server.webapp.WebApp;import com.caucho.util.Alarm;import com.caucho.util.CacheListener;import com.caucho.util.FreeList;import com.caucho.util.LruCache;import com.caucho.vfs.MemoryPath;import com.caucho.vfs.Path;import com.caucho.vfs.PersistentDependency;import com.caucho.webbeans.context.DependentScope;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.PageContext;import javax.servlet.ServletConfig;import java.io.FileNotFoundException;import java.util.ArrayList;import java.util.Iterator;import java.util.logging.Level;import java.util.logging.Logger;/** * Parent template manager for both JspManager and XtpManager. PageManager * is responsible for caching pages until the underlying files change. */abstract public class PageManager { private final static Logger log = Logger.getLogger(PageManager.class.getName()); static final long ACCESS_INTERVAL = 60000L; private FreeList<PageContextImpl> _freePages = new FreeList<PageContextImpl>(256); protected WebApp _webApp; private Path _classDir; private long _updateInterval = 1000; private boolean _isAdapter; private boolean _omitInitLog; private int _pageCacheMax = 1024; private LruCache<String,Entry> _cache; // true if the manager should detect page changes and automatically recompile protected boolean _autoCompile = true; /** * Create a new PageManager * * @param context the servlet webApp. */ PageManager() { } void initWebApp(WebApp webApp) { _webApp = webApp; _classDir = CauchoSystem.getWorkPath(); long interval = Environment.getDependencyCheckInterval(); JspPropertyGroup jspPropertyGroup = _webApp.getJsp(); if (jspPropertyGroup != null) { _autoCompile = jspPropertyGroup.isAutoCompile(); if (jspPropertyGroup.getJspMax() > 0) _pageCacheMax = jspPropertyGroup.getJspMax(); if (jspPropertyGroup.getDependencyCheckInterval() != Long.MIN_VALUE) interval = jspPropertyGroup.getDependencyCheckInterval(); } if (interval < 0) interval = Integer.MAX_VALUE / 2; _updateInterval = interval; } void setPageCacheMax(int max) { _pageCacheMax = max; } public Path getClassDir() { if (_classDir != null) return _classDir; else { Path appDir = _webApp.getAppDir(); if (appDir instanceof MemoryPath) { String workPathName = ("./" + _webApp.getURL()); Path path = CauchoSystem.getWorkPath().lookup(workPathName); return path; } else return appDir.lookup("WEB-INF/work"); } } public Path getAppDir() { return _webApp.getAppDir(); } /** * Returns the CauchoWebApp for the manager. */ WebApp getWebApp() { return _webApp; } public PageContextImpl allocatePageContext(Servlet servlet, ServletRequest request, ServletResponse response, String errorPageURL, boolean needsSession, int buffer, boolean autoFlush) { PageContextImpl pc = _freePages.allocate(); if (pc == null) pc = new PageContextImpl(); try { pc.initialize(servlet, request, response, errorPageURL, needsSession, buffer, autoFlush); } catch (Exception e) { } return pc; } /** * The jsp page context initialization. */ public PageContextImpl allocatePageContext(Servlet servlet, WebApp app, ServletRequest request, ServletResponse response, String errorPageURL, HttpSession session, int buffer, boolean autoFlush, boolean isPrintNullAsBlank) { PageContextImpl pc = _freePages.allocate(); if (pc == null) pc = new PageContextImpl(); pc.initialize(servlet, app, request, response, errorPageURL, session, buffer, autoFlush, isPrintNullAsBlank); return pc; } public void freePageContext(PageContext pc) { if (pc != null) { pc.release(); if (pc instanceof PageContextImpl) _freePages.free((PageContextImpl) pc); } } /** * Compiles and returns the page at the given path and uri. The uri * is needed for jsp:include, etc. in the JSP pages. * * @param path Path to the page. * @param uri uri of the page. * * @return the compiled JSP (or XTP) page. */ public Page getPage(String uri, Path path) throws Exception { return getPage(uri, uri, path, null); } /** * Compiles and returns the page at the given path and uri. The uri * is needed for jsp:include, etc. in the JSP pages. * * @param path Path to the page. * @param uri uri of the page. * * @return the compiled JSP (or XTP) page. */ public Page getPage(String uri, String pageURI, Path path, ServletConfig config) throws Exception { return getPage(uri, pageURI, path, config, null); } /** * Compiles and returns the page at the given path and uri. The uri * is needed for jsp:include, etc. in the JSP pages. * * @param uri uri of the page. * @param uri uri of the page. * @param path Path to the page. * * @return the compiled JSP (or XTP) page. */ public Page getPage(String uri, String pageURI, Path path, ServletConfig config, ArrayList<PersistentDependency> dependList) throws Exception { LruCache<String,Entry> cache = _cache; if (cache == null) { initPageManager(); synchronized (this) { if (_cache == null) _cache = new LruCache<String,Entry>(_pageCacheMax); cache = _cache; } } Entry entry = null; synchronized (cache) { entry = cache.get(uri); if (entry == null) { entry = new Entry(uri); cache.put(uri, entry); } } synchronized (entry) { Page page = entry.getPage(); if (page != null && ! page.cauchoIsModified()) return page; else if (page != null && ! page.isDead()) { try { page.destroy(); } catch (Exception e) { log.log(Level.FINE, e.toString(), e); } } if (log.isLoggable(Level.FINE)) { log.fine("Jsp[] uri:" + uri + "(cp:" + getWebApp().getContextPath() + ",app:" + getWebApp().getAppDir() + ") -> " + path); } Path appDir = getWebApp().getAppDir(); String rawClassName = pageURI; if (path.getPath().startsWith(appDir.getPath())) rawClassName = path.getPath().substring(appDir.getPath().length()); String className = JavaCompiler.mangleName("jsp/" + rawClassName); page = createPage(path, pageURI, className, config, dependList); if (page == null) { log.fine("Jsp[] cannot create page " + path.getURL()); throw new FileNotFoundException(getWebApp().getContextPath() + pageURI); } if (_autoCompile == false) page._caucho_setNeverModified(true); page._caucho_setUpdateInterval(_updateInterval); try { ArrayList<ConfigProgram> injectList = new ArrayList<ConfigProgram>(); InjectIntrospector.introspectInject(injectList, page.getClass()); ConfigContext env = new ConfigContext(); for (ConfigProgram inject : injectList) { inject.inject(page, env); } } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new RuntimeException(e); } entry.setPage(page); return page; } } protected void initPageManager() { } /** * Implementation-specific method to create the actual page. JspManager * and XtpManager define this for their specific needs. */ abstract Page createPage(Path path, String uri, String className, ServletConfig config, ArrayList<PersistentDependency> dependList) throws Exception; void killPage(HttpServletRequest request, HttpServletResponse response, Page page) { } /** * Clean up the pages when the server shuts down. */ void destroy() { LruCache<String,Entry> cache = _cache; _cache = null; if (cache == null) return; synchronized (cache) { Iterator<Entry> iter = cache.values(); while (iter.hasNext()) { Entry entry = iter.next(); Page page = entry != null ? entry.getPage() : null; try { if (page != null && ! page.isDead()) { page.destroy(); } } catch (Exception e) { log.log(Level.WARNING, e.toString(), e); } } } } class Entry implements CacheListener { private String _key; Page _page; private long _lastAccessTime; Entry(String key) { _key = key; } void setPage(Page page) { _page = page; if (page != null) page._caucho_setEntry(this); } Page getPage() { return _page; } public void accessPage() { long now = Alarm.getCurrentTime(); if (now < _lastAccessTime + ACCESS_INTERVAL) return; _lastAccessTime = now; if (_cache != null) _cache.get(_key); } public void removeEvent() { Page page = _page; _page = null; if (page != null && ! page.isDead()) { if (log.isLoggable(Level.FINE)) log.fine("dropping page " + page); page.setDead(); page.destroy(); } } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?