001: /*
002: * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved
003: *
004: * This file is part of Resin(R) Open Source
005: *
006: * Each copy or derived work must preserve the copyright notice and this
007: * notice unmodified.
008: *
009: * Resin Open Source is free software; you can redistribute it and/or modify
010: * it under the terms of the GNU General Public License as published by
011: * the Free Software Foundation; either version 2 of the License, or
012: * (at your option) any later version.
013: *
014: * Resin Open Source is distributed in the hope that it will be useful,
015: * but WITHOUT ANY WARRANTY; without even the implied warranty of
016: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
017: * of NON-INFRINGEMENT. See the GNU General Public License for more
018: * details.
019: *
020: * You should have received a copy of the GNU General Public License
021: * along with Resin Open Source; if not, write to the
022: * Free SoftwareFoundation, Inc.
023: * 59 Temple Place, Suite 330
024: * Boston, MA 02111-1307 USA
025: *
026: * @author Scott Ferguson
027: */
028:
029: package com.caucho.jsp;
030:
031: import com.caucho.util.CharBuffer;
032: import com.caucho.vfs.Depend;
033: import com.caucho.vfs.Path;
034: import com.caucho.vfs.PersistentDependency;
035: import com.caucho.vfs.ReadStream;
036: import com.caucho.vfs.TempCharBuffer;
037: import com.caucho.vfs.WriteStream;
038:
039: import javax.servlet.ServletException;
040: import javax.servlet.ServletRequest;
041: import javax.servlet.ServletResponse;
042: import javax.servlet.http.HttpServletRequest;
043: import javax.servlet.http.HttpServletResponse;
044: import java.io.IOException;
045: import java.io.PrintWriter;
046: import java.util.ArrayList;
047:
048: /**
049: * A static page is a page that's just a static file.
050: */
051: public class StaticPage extends Page {
052: private Path _cacheEntry;
053: private long _lastModified;
054: private int _contentLength;
055: private boolean _hasSession;
056:
057: /**
058: * Create a new Static page.
059: *
060: * @param path the underlying file
061: * @param hasSession if true, create a new session
062: */
063: StaticPage(Path path, boolean hasSession) throws IOException {
064: _cacheEntry = path;
065: _contentLength = (int) _cacheEntry.getLength();
066: _hasSession = hasSession;
067:
068: _caucho_setCacheable();
069: }
070:
071: public void init(Path path) throws ServletException {
072: }
073:
074: /**
075: * Returns true if the source has modified for this page.
076: */
077: public boolean _caucho_isModified() {
078: return !_cacheEntry.exists() || super ._caucho_isModified();
079: }
080:
081: void _caucho_setUncacheable() {
082: _lastModified = 0;
083: }
084:
085: public long getLastModified(HttpServletRequest request) {
086: return _caucho_lastModified();
087: }
088:
089: /**
090: * Executes the JSP Page
091: */
092: public void service(ServletRequest request, ServletResponse response)
093: throws IOException, ServletException {
094: HttpServletRequest req = (HttpServletRequest) request;
095: HttpServletResponse res = (HttpServletResponse) response;
096:
097: _caucho_init(req, res);
098:
099: if (_hasSession) {
100: req.getSession();
101: res.setHeader("Cache-Control", "private");
102: }
103:
104: // res.setContentLength(_contentLength);
105:
106: TempCharBuffer buf = TempCharBuffer.allocate();
107: char[] cBuf = buf.getBuffer();
108: int len;
109:
110: PrintWriter out = response.getWriter();
111:
112: ReadStream rs = _cacheEntry.openRead();
113: rs.setEncoding("UTF-8");
114: try {
115: while ((len = rs.read(cBuf, 0, cBuf.length)) > 0) {
116: out.write(cBuf, 0, len);
117: }
118: } finally {
119: rs.close();
120: }
121:
122: TempCharBuffer.free(buf);
123: }
124:
125: public boolean disableLog() {
126: return true;
127: }
128:
129: public static void writeDepend(Path dependPath,
130: ArrayList<PersistentDependency> dependList)
131: throws IOException {
132: WriteStream os = dependPath.openWrite();
133: try {
134: for (int i = 0; i < dependList.size(); i++) {
135: PersistentDependency dependency = dependList.get(i);
136:
137: if (dependency instanceof Depend) {
138: Depend depend = (Depend) dependency;
139:
140: os.print('"');
141: os.print(depend.getPath().getNativePath());
142: os.print("\" \"");
143: os.print(depend.getDigest());
144: os.println("\"");
145: }
146: }
147: } finally {
148: os.close();
149: }
150: }
151:
152: static ArrayList<Depend> parseDepend(Path dependPath)
153: throws IOException {
154: ReadStream is = dependPath.openRead();
155: try {
156: ArrayList<Depend> dependList = new ArrayList<Depend>();
157:
158: String name;
159:
160: while ((name = parseName(is)) != null) {
161: long digest = Long.parseLong(parseName(is));
162:
163: Depend depend = new Depend(dependPath.lookup(name),
164: digest);
165:
166: dependList.add(depend);
167: }
168:
169: return dependList;
170: } finally {
171: is.close();
172: }
173: }
174:
175: private static String parseName(ReadStream is) throws IOException {
176: int ch;
177:
178: for (ch = is.read(); ch > 0 && ch != '"'; ch = is.read()) {
179: }
180:
181: if (ch < 0)
182: return null;
183:
184: CharBuffer cb = new CharBuffer();
185:
186: for (ch = is.read(); ch > 0 && ch != '"'; ch = is.read()) {
187: cb.append((char) ch);
188: }
189:
190: if (ch < 0)
191: return null;
192:
193: return cb.toString();
194: }
195:
196: public void destroy() {
197: /*
198: try {
199: _cacheEntry.remove();
200: } catch (IOException e) {
201: }
202: */
203: }
204:
205: /**
206: * Returns a printable version of the static page object.
207: */
208: public String toString() {
209: return "StaticPage[" + _cacheEntry + "]";
210: }
211: }
|