* Encapsulate fields in ResponseTrans and make them private.

* Store response debug buffer in session over redirects (in addition to message).
This commit is contained in:
hns 2006-01-13 16:50:41 +00:00
parent a3fa56750c
commit b81f231c70
6 changed files with 256 additions and 108 deletions

View file

@ -228,7 +228,7 @@ public class ResponseBean implements Serializable {
* @return true if the response may be cached by the HTTP client, false otherwise
*/
public boolean getCache() {
return res.cache;
return res.isCacheable();
}
/**
@ -237,7 +237,7 @@ public class ResponseBean implements Serializable {
* @param cache true if the response may be cached by the HTTP client, false otherwise
*/
public void setCache(boolean cache) {
res.cache = cache;
res.setCacheable(cache);
}
/**
@ -246,7 +246,7 @@ public class ResponseBean implements Serializable {
* @return The charset name
*/
public String getCharset() {
return res.charset;
return res.getCharset();
}
/**
@ -255,7 +255,7 @@ public class ResponseBean implements Serializable {
* @param charset The charset name
*/
public void setCharset(String charset) {
res.charset = charset;
res.setCharset(charset);
}
/**
@ -264,7 +264,7 @@ public class ResponseBean implements Serializable {
* @return the content type
*/
public String getContentType() {
return res.contentType;
return res.getContentType();
}
/**
@ -273,7 +273,7 @@ public class ResponseBean implements Serializable {
* @param contentType The charset name
*/
public void setContentType(String contentType) {
res.contentType = contentType;
res.setContentType(contentType);
}
/**
@ -309,7 +309,7 @@ public class ResponseBean implements Serializable {
* @return the error message
*/
public String getError() {
return res.error;
return res.getError();
}
/**
@ -318,7 +318,7 @@ public class ResponseBean implements Serializable {
* @return the message
*/
public String getMessage() {
return res.message;
return res.getMessage();
}
/**
@ -327,7 +327,7 @@ public class ResponseBean implements Serializable {
* @param message the message property
*/
public void setMessage(String message) {
res.message = message;
res.setMessage(message);
}
/**
@ -336,7 +336,7 @@ public class ResponseBean implements Serializable {
* @return the HTTP authentication realm
*/
public String getRealm() {
return res.realm;
return res.getRealm();
}
/**
@ -345,7 +345,7 @@ public class ResponseBean implements Serializable {
* @param realm the HTTP authentication realm
*/
public void setRealm(String realm) {
res.realm = realm;
res.setRealm(realm);
}
/**
@ -372,7 +372,7 @@ public class ResponseBean implements Serializable {
* @return the HTTP status code
*/
public int getStatus() {
return res.status;
return res.getStatus();
}
/**
@ -381,7 +381,7 @@ public class ResponseBean implements Serializable {
* @param status the HTTP status code
*/
public void setStatus(int status) {
res.status = status;
res.setStatus(status);
}
/**

View file

@ -38,30 +38,20 @@ public final class ResponseTrans extends Writer implements Serializable {
static final String newLine = System.getProperty("line.separator");
/**
* Set the MIME content type of the response.
*/
public String contentType = "text/html";
// MIME content type of the response.
private String contentType = "text/html";
/**
* Set the charset (encoding) to use for the response.
*/
public String charset;
// Charset (encoding) to use for the response.
private String charset;
/**
* used to allow or disable client side caching
*/
public boolean cache = true;
// Used to allow or disable client side caching
private boolean cacheable = true;
/**
* Value for HTTP response code, defaults to 200 (OK).
*/
public int status = 200;
// HTTP response code, defaults to 200 (OK).
private int status = 200;
/**
* Used for HTTP authentication
*/
public String realm;
// HTTP authentication realm
private String realm;
// the actual response
private byte[] response = null;
@ -102,15 +92,11 @@ public final class ResponseTrans extends Writer implements Serializable {
// buffer for debug messages - will be automatically appended to response
private transient StringBuffer debugBuffer;
/**
* string fields that hold a user message
*/
public transient String message;
// field for generic message to be displayed
private transient String message;
/**
* string fields that hold an error message
*/
public transient String error;
// field for error message
private transient String error;
// the res.data map of form and cookie data
private transient Map values = new SystemMap();
@ -191,7 +177,7 @@ public final class ResponseTrans extends Writer implements Serializable {
buffers = null;
response = null;
cache = true;
cacheable = true;
redir = forward = message = error = null;
etag = realm = charset = null;
contentType = "text/html";
@ -629,22 +615,24 @@ public final class ResponseTrans extends Writer implements Serializable {
wait(10000L);
}
} catch (InterruptedException ix) {
// Ignore
}
}
/**
* Get the body content for this response as byte array, encoded using the
* response's charset.
*
*
* @return ...
* @return the response body
*/
public byte[] getContent() {
return (response == null) ? new byte[0] : response;
}
/**
* Get the number of bytes of the response body.
*
*
* @return ...
* @return the length of the response body
*/
public int getContentLength() {
if (response != null) {
@ -655,9 +643,9 @@ public final class ResponseTrans extends Writer implements Serializable {
}
/**
* Get the response's MIME content type
*
*
* @return ...
* @return the MIME type for this response
*/
public String getContentType() {
if (charset != null) {
@ -667,10 +655,20 @@ public final class ResponseTrans extends Writer implements Serializable {
return contentType;
}
/**
* Set the response's MIME content type
*
* @param contentType MIME type for this response
*/
public void setContentType(String contentType) {
this.contentType = contentType;
}
/**
* Set the Last-Modified header for this response
*
* @param modified ...
* @param modified the Last-Modified header in milliseconds
*/
public void setLastModified(long modified) {
if ((modified > -1) && (reqtrans != null) &&
@ -683,18 +681,18 @@ public final class ResponseTrans extends Writer implements Serializable {
}
/**
* Get the value of the Last-Modified header for this response.
*
*
* @return ...
* @return the Last-Modified header in milliseconds
*/
public long getLastModified() {
return lastModified;
}
/**
* Set the ETag header value for this response.
*
*
* @param value ...
* @param value the ETag header value
*/
public void setETag(String value) {
etag = (value == null) ? null : ("\"" + value + "\"");
@ -706,27 +704,27 @@ public final class ResponseTrans extends Writer implements Serializable {
}
/**
* Get the ETag header value for this response.
*
*
* @return ...
* @return the ETag header value
*/
public String getETag() {
return etag;
}
/**
* Check if this response should generate a Not-Modified response.
*
*
* @return ...
* @return true if the the response wasn't modified since the client last saw it.
*/
public boolean getNotModified() {
return notModified;
}
/**
* Add a dependency to this response.
*
*
* @param what ...
* @param what an item this response's output depends on.
*/
public void dependsOn(Object what) {
if (digest == null) {
@ -755,7 +753,7 @@ public final class ResponseTrans extends Writer implements Serializable {
}
/**
*
* Digest all dependencies to a checksum to see if the response has changed.
*/
public void digestDependencies() {
if (digest == null) {
@ -770,9 +768,10 @@ public final class ResponseTrans extends Writer implements Serializable {
}
/**
* Set the path in which to look for skins. This may contain file locations and
* HopObjects.
*
*
* @param arr ...
* @param arr the skin path
*/
public void setSkinpath(Object[] arr) {
this.skinpath = arr;
@ -780,9 +779,10 @@ public final class ResponseTrans extends Writer implements Serializable {
}
/**
* Get the path in which to look for skins. This may contain file locations and
* HopObjects.
*
*
* @return ...
* @return the skin path
*/
public Object[] getSkinpath() {
if (skinpath == null) {
@ -793,11 +793,10 @@ public final class ResponseTrans extends Writer implements Serializable {
}
/**
* Look up a cached skin.
*
*
* @param id ...
*
* @return ...
* @param id the skin key
* @return the skin, or null if no skin is cached for the given key
*/
public Skin getCachedSkin(Object id) {
if (skincache == null) {
@ -808,10 +807,10 @@ public final class ResponseTrans extends Writer implements Serializable {
}
/**
* Cache a skin for the length of this response.
*
*
* @param id ...
* @param skin ...
* @param id the skin key
* @param skin the skin to cache
*/
public void cacheSkin(Object id, Skin skin) {
if (skincache == null) {
@ -822,13 +821,13 @@ public final class ResponseTrans extends Writer implements Serializable {
}
/**
* Set a cookie.
*
*
* @param key ...
* @param value ...
* @param days ...
* @param path ...
* @param domain ...
* @param key the cookie key
* @param value the cookie value
* @param days the cookie's lifespan in days
* @param path the URL path to apply the cookie to
* @param domain the domain to apply the cookie to
*/
public void setCookie(String key, String value, int days, String path, String domain) {
CookieTrans c = null;
@ -852,7 +851,7 @@ public final class ResponseTrans extends Writer implements Serializable {
}
/**
*
* Reset all previously set cookies.
*/
public void resetCookies() {
if (cookies != null) {
@ -861,9 +860,9 @@ public final class ResponseTrans extends Writer implements Serializable {
}
/**
* Get the number of cookies set in this response.
*
*
* @return ...
* @return the number of cookies
*/
public int countCookies() {
if (cookies != null) {
@ -874,9 +873,9 @@ public final class ResponseTrans extends Writer implements Serializable {
}
/**
* Get the cookies set in this response.
*
*
* @return ...
* @return the cookies
*/
public CookieTrans[] getCookies() {
if (cookies == null) {
@ -884,9 +883,119 @@ public final class ResponseTrans extends Writer implements Serializable {
}
CookieTrans[] c = new CookieTrans[cookies.size()];
cookies.values().toArray(c);
return c;
}
/**
* Get the message to display to the user, if any.
* @return the message
*/
public String getMessage() {
return message;
}
/**
* Set a message to display to the user.
* @param message the message
*/
public void setMessage(String message) {
this.message = message;
}
/**
* Get the error message to display to the user, if any.
* @return the error message
*/
public String getError() {
return error;
}
/**
* Set a message to display to the user.
* @param error the error message
*/
public void setError(String error) {
this.error = error;
}
/**
* Get debug messages to append to the response, if any.
* @return the response's debug buffer
*/
public StringBuffer getDebugBuffer() {
return debugBuffer;
}
/**
* Set debug messages to append to the response.
* @param debugBuffer the response's debug buffer
*/
public void setDebugBuffer(StringBuffer debugBuffer) {
this.debugBuffer = debugBuffer;
}
/**
* Get the charset/encoding for this response
* @return the charset name
*/
public String getCharset() {
return charset;
}
/**
* Set the charset/encoding for this response
* @param charset the charset name
*/
public void setCharset(String charset) {
this.charset = charset;
}
/**
* Returns true if this response may be cached by the client
* @return true if the response may be cached
*/
public boolean isCacheable() {
return cacheable;
}
/**
* Set the cacheability of this response
* @param cache true if the response may be cached
*/
public void setCacheable(boolean cache) {
this.cacheable = cache;
}
/**
* Get the HTTP response status code
* @return the HTTP response code
*/
public int getStatus() {
return status;
}
/**
* Set the HTTP response status code
* @param status the HTTP response code
*/
public void setStatus(int status) {
this.status = status;
}
/**
* Get the HTTP authentication realm
* @return the name of the authentication realm
*/
public String getRealm() {
return realm;
}
/**
* Set the HTTP authentication realm
* @param realm the name of the authentication realm
*/
public void setRealm(String realm) {
this.realm = realm;
}
}

View file

@ -88,7 +88,6 @@ public final class RequestEvaluator implements Runnable {
if (scriptingEngine == null) {
String engineClassName = app.getProperty("scriptingEngine",
"helma.scripting.rhino.RhinoEngine");
try {
Class clazz = app.getClassLoader().loadClass(engineClassName);
@ -183,17 +182,14 @@ public final class RequestEvaluator implements Runnable {
String action = null;
if (error != null) {
res.error = error;
res.setError(error);
}
switch (reqtype) {
case HTTP:
if (session.message != null) {
// bring over the message from a redirect
res.message = session.message;
session.message = null;
}
// bring over the message from a redirect
session.recoverResponseMessages(res);
// catch redirect in path resolution or script execution
try {
@ -292,7 +288,7 @@ public final class RequestEvaluator implements Runnable {
// The path could not be resolved. Check if there is a "not found" action
// specified in the property file.
res.status = 404;
res.setStatus(404);
String notFoundAction = app.props.getProperty("notfound",
"notfound");
@ -381,9 +377,7 @@ public final class RequestEvaluator implements Runnable {
}
} catch (RedirectException redirect) {
// if there is a message set, save it on the user object for the next request
if (res.message != null) {
session.message = res.message;
}
session.storeResponseMessages(res);
}
// check if we're still the one and only or if the waiting thread has given up on us already

View file

@ -18,6 +18,8 @@ package helma.framework.core;
import helma.objectmodel.*;
import helma.objectmodel.db.*;
import helma.framework.ResponseTrans;
import java.io.*;
import java.util.*;
@ -47,6 +49,7 @@ public class Session implements Serializable {
// used to remember messages to the user between requests, mainly between redirects.
protected String message;
protected StringBuffer debugBuffer;
/**
* Creates a new Session object.
@ -105,11 +108,7 @@ public class Session implements Serializable {
* @return ...
*/
public boolean isLoggedIn() {
if ((userHandle != null) && (uid != null)) {
return true;
} else {
return false;
}
return (userHandle != null) && (uid != null);
}
/**
@ -256,6 +255,30 @@ public class Session implements Serializable {
}
/**
* Set the user and debug messages over from a previous response.
* This is used for redirects, where messages can't be displayed immediately.
* @param res the response to set the messages on
*/
public synchronized void recoverResponseMessages(ResponseTrans res) {
if (message != null || debugBuffer != null) {
res.setMessage(message);
res.setDebugBuffer(debugBuffer);
message = null;
debugBuffer = null;
}
}
/**
* Remember the response's user and debug messages for a later response.
* This is used for redirects, where messages can't be displayed immediately.
* @param res the response to retrieve the messages from
*/
public synchronized void storeResponseMessages(ResponseTrans res) {
message = res.getMessage();
debugBuffer = res.getDebugBuffer();
}
/**
* Return the message that is to be displayed upon the next
* request within this session.
@ -272,9 +295,31 @@ public class Session implements Serializable {
* the current request can't be used to display a user visible
* message.
*
* @param msg
* @param msg the message
*/
public void setMessage(String msg) {
message = msg;
}
/**
* Return the debug buffer that is to be displayed upon the next
* request within this session.
*
* @return the debug buffer, or null if none was set.
*/
public StringBuffer getDebugBuffer() {
return debugBuffer;
}
/**
* Set the debug buffer to be displayed to this session's user. This
* can be used to save the debug buffer over to the next request when
* the current request can't be used to display a user visible
* message.
*
* @param buffer the buffer
*/
public void setDebugBuffer(StringBuffer buffer) {
debugBuffer = buffer;
}
}

View file

@ -594,9 +594,9 @@ public final class Skin {
Object value = null;
if ("message".equals(name)) {
value = reval.getResponse().message;
value = reval.getResponse().getMessage();
} else if ("error".equals(name)) {
value = reval.getResponse().error;
value = reval.getResponse().getError();
}
if (value == null) {

View file

@ -366,7 +366,7 @@ public abstract class AbstractServletClient extends HttpServlet {
} else if (hopres.getNotModified()) {
res.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
} else {
if (!hopres.cache || !caching) {
if (!hopres.isCacheable() || !caching) {
// Disable caching of response.
// for HTTP 1.0
res.setDateHeader("Expires", System.currentTimeMillis() - 10000);
@ -377,12 +377,12 @@ public abstract class AbstractServletClient extends HttpServlet {
"no-cache, no-store, must-revalidate, max-age=0");
}
if (hopres.realm != null) {
res.setHeader("WWW-Authenticate", "Basic realm=\"" + hopres.realm + "\"");
if (hopres.getRealm() != null) {
res.setHeader("WWW-Authenticate", "Basic realm=\"" + hopres.getRealm() + "\"");
}
if (hopres.status > 0) {
res.setStatus(hopres.status);
if (hopres.getStatus() > 0) {
res.setStatus(hopres.getStatus());
}
// set last-modified header to now