/* * Copyright (c) 1998-2011 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 SoftwareFoundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */ package com.caucho.jsp; import com.caucho.util.CharBuffer; import com.caucho.vfs.Depend; import com.caucho.vfs.Path; import com.caucho.vfs.PersistentDependency; import com.caucho.vfs.ReadStream; import com.caucho.vfs.TempCharBuffer; import com.caucho.vfs.WriteStream; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; /** * A static page is a page that's just a static file. */ public class StaticPage extends Page { private Path _cacheEntry; private long _lastModified; private int _contentLength; private boolean _hasSession; /** * Create a new Static page. * * @param path the underlying file * @param hasSession if true, create a new session */ StaticPage(Path path, boolean hasSession) throws IOException { _cacheEntry = path; _contentLength = (int) _cacheEntry.getLength(); _hasSession = hasSession; _caucho_setCacheable(); } public void init(Path path) throws ServletException { } /** * Returns true if the source has modified for this page. */ public boolean _caucho_isModified() { return ! _cacheEntry.exists() || super._caucho_isModified(); } void _caucho_setUncacheable() { _lastModified = 0; } public long getLastModified(HttpServletRequest request) { return _caucho_lastModified(); } /** * Executes the JSP Page */ public void service(ServletRequest request, ServletResponse response) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; _caucho_init(req, res); if (_hasSession) { req.getSession(); res.setHeader("Cache-Control", "private"); } // res.setContentLength(_contentLength); TempCharBuffer buf = TempCharBuffer.allocate(); char []cBuf = buf.getBuffer(); int len; PrintWriter out = response.getWriter(); ReadStream rs = _cacheEntry.openRead(); rs.setEncoding("UTF-8"); try { while ((len = rs.read(cBuf, 0, cBuf.length)) > 0) { out.write(cBuf, 0, len); } } finally { rs.close(); } TempCharBuffer.free(buf); } public boolean disableLog() { return true; } public static void writeDepend(Path dependPath, ArrayList<PersistentDependency> dependList) throws IOException { WriteStream os = dependPath.openWrite(); try { for (int i = 0; i < dependList.size(); i++) { PersistentDependency dependency = dependList.get(i); if (dependency instanceof Depend) { Depend depend = (Depend) dependency; os.print('"'); os.print(depend.getPath().getNativePath()); os.print("\" \""); os.print(depend.getDigest()); os.println("\""); } } } finally { os.close(); } } static ArrayList<Depend> parseDepend(Path dependPath) throws IOException { ReadStream is = dependPath.openRead(); try { ArrayList<Depend> dependList = new ArrayList<Depend>(); String name; while ((name = parseName(is)) != null) { long digest = Long.parseLong(parseName(is)); Depend depend = new Depend(dependPath.lookup(name), digest); dependList.add(depend); } return dependList; } finally { is.close(); } } private static String parseName(ReadStream is) throws IOException { int ch; for (ch = is.read(); ch > 0 && ch != '"'; ch = is.read()) { } if (ch < 0) return null; CharBuffer cb = new CharBuffer(); for (ch = is.read(); ch > 0 && ch != '"'; ch = is.read()) { cb.append((char) ch); } if (ch < 0) return null; return cb.toString(); } public void destroy() { /* try { _cacheEntry.remove(); } catch (IOException e) { } */ } /** * Returns a printable version of the static page object. */ public String toString() { return "StaticPage[" + _cacheEntry + "]"; } }