Code clean-up.

This commit is contained in:
Harald Kuhr
2011-12-19 14:30:40 +01:00
parent 0c4fc454b9
commit 49f5ab8e64
64 changed files with 309 additions and 242 deletions

View File

@@ -9,7 +9,7 @@ import java.util.*;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/AbstractServletMapAdapter.java#1 $
* @version $Id: AbstractServletMapAdapter.java#1 $
*/
abstract class AbstractServletMapAdapter extends AbstractMap<String, List<String>> {
// TODO: This map is now a little too lazy.. Should cache entries too (instead?) !

View File

@@ -30,16 +30,16 @@ package com.twelvemonkeys.servlet;
import com.twelvemonkeys.lang.StringUtil;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.IOException;
import java.util.Properties;
import java.util.List;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
@@ -47,12 +47,13 @@ import java.util.regex.PatternSyntaxException;
* BrowserHelperFilter
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/BrowserHelperFilter.java#1 $
* @version $Id: BrowserHelperFilter.java#1 $
*/
public class BrowserHelperFilter extends GenericFilter {
private static final String HTTP_HEADER_ACCEPT = "Accept";
protected static final String HTTP_HEADER_USER_AGENT = "User-Agent";
// TODO: Consider using unmodifiable LinkedHashMap<Pattern, String> instead
private Pattern[] knownAgentPatterns;
private String[] knownAgentAccepts;
@@ -68,45 +69,52 @@ public class BrowserHelperFilter extends GenericFilter {
// <agent-name>.accept=<http-accept-header>
Properties mappings = new Properties();
try {
log("Reading Accept-mappings properties file: " + pPropertiesFile);
mappings.load(getServletContext().getResourceAsStream(pPropertiesFile));
List<Pattern> patterns = new ArrayList<Pattern>();
List<String> accepts = new ArrayList<String>();
//System.out.println("--> Loaded file: " + pPropertiesFile);
for (Object key : mappings.keySet()) {
String agent = (String) key;
if (agent.endsWith(".accept")) {
continue;
}
//System.out.println("--> Adding accept-mapping for User-Agent: " + agent);
try {
String accept = (String) mappings.get(agent + ".accept");
if (!StringUtil.isEmpty(accept)) {
patterns.add(Pattern.compile((String) mappings.get(agent)));
accepts.add(accept);
//System.out.println("--> " + agent + " accepts: " + accept);
}
else {
log("Missing Accept mapping for User-Agent: " + agent);
}
}
catch (PatternSyntaxException e) {
log("Could not parse User-Agent identification for " + agent, e);
}
knownAgentPatterns = patterns.toArray(new Pattern[patterns.size()]);
knownAgentAccepts = accepts.toArray(new String[accepts.size()]);
}
}
catch (IOException e) {
throw new ServletConfigException("Could not read Accept-mappings properties file: " + pPropertiesFile, e);
}
parseMappings(mappings);
}
private void parseMappings(Properties mappings) {
List<Pattern> patterns = new ArrayList<Pattern>();
List<String> accepts = new ArrayList<String>();
for (Object key : mappings.keySet()) {
String agent = (String) key;
if (agent.endsWith(".accept")) {
continue;
}
//System.out.println("--> Adding accept-mapping for User-Agent: " + agent);
try {
String accept = (String) mappings.get(agent + ".accept");
if (!StringUtil.isEmpty(accept)) {
patterns.add(Pattern.compile((String) mappings.get(agent)));
accepts.add(accept);
//System.out.println("--> " + agent + " accepts: " + accept);
}
else {
log("Missing Accept mapping for User-Agent: " + agent);
}
}
catch (PatternSyntaxException e) {
log("Could not parse User-Agent identification for " + agent, e);
}
knownAgentPatterns = patterns.toArray(new Pattern[patterns.size()]);
knownAgentAccepts = accepts.toArray(new String[accepts.size()]);
}
}
public void init() throws ServletException {
@@ -119,6 +127,7 @@ public class BrowserHelperFilter extends GenericFilter {
if (pRequest instanceof HttpServletRequest) {
//System.out.println("--> Trying to find User-Agent/Accept headers...");
HttpServletRequest request = (HttpServletRequest) pRequest;
// Check if User-Agent is in list of known agents
if (knownAgentPatterns != null && knownAgentPatterns.length > 0) {
String agent = request.getHeader(HTTP_HEADER_USER_AGENT);
@@ -127,10 +136,10 @@ public class BrowserHelperFilter extends GenericFilter {
for (int i = 0; i < knownAgentPatterns.length; i++) {
Pattern pattern = knownAgentPatterns[i];
//System.out.println("--> Pattern: " + pattern);
if (pattern.matcher(agent).matches()) {
// TODO: Consider merge known with real accpet, in case plugins add extra capabilities?
final String fakeAccept = knownAgentAccepts[i];
if (pattern.matcher(agent).matches()) {
// TODO: Consider merge known with real accept, in case plugins add extra capabilities?
final String fakeAccept = knownAgentAccepts[i];
//System.out.println("--> User-Agent: " + agent + " accepts: " + fakeAccept);
pRequest = new HttpServletRequestWrapper(request) {
@@ -138,9 +147,11 @@ public class BrowserHelperFilter extends GenericFilter {
if (HTTP_HEADER_ACCEPT.equals(pName)) {
return fakeAccept;
}
return super.getHeader(pName);
}
};
break;
}
}

View File

@@ -42,7 +42,7 @@ import java.util.Enumeration;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/DebugServlet.java#1 $
* @version $Id: DebugServlet.java#1 $
*/
public class DebugServlet extends GenericServlet {
private long dateModified;

View File

@@ -61,7 +61,7 @@ import java.util.Enumeration;
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
*
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/GenericFilter.java#1 $
* @version $Id: GenericFilter.java#1 $
*
* @see Filter
* @see FilterConfig

View File

@@ -47,7 +47,7 @@ import java.lang.reflect.InvocationTargetException;
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
*
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/GenericServlet.java#1 $
* @version $Id: GenericServlet.java#1 $
*/
public abstract class GenericServlet extends javax.servlet.GenericServlet {
@@ -72,7 +72,7 @@ public abstract class GenericServlet extends javax.servlet.GenericServlet {
@Override
public void init(final ServletConfig pConfig) throws ServletException {
if (pConfig == null) {
throw new ServletConfigException("servletconfig == null");
throw new ServletConfigException("servlet config == null");
}
try {

View File

@@ -41,13 +41,13 @@ import java.lang.reflect.InvocationTargetException;
* the method matching the signature {@code void setX(&lt;Type&gt;)},
* for every init-parameter {@code x}. Both camelCase and lisp-style paramter
* naming is supported, lisp-style names will be converted to camelCase.
* Parameter values are automatically converted from string represenation to
* most basic types, if neccessary.
* Parameter values are automatically converted from string representation to
* most basic types, if necessary.
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
*
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/HttpServlet.java#1 $
* @version $Id: HttpServlet.java#1 $
*/
public abstract class HttpServlet extends javax.servlet.http.HttpServlet {
@@ -63,7 +63,7 @@ public abstract class HttpServlet extends javax.servlet.http.HttpServlet {
* have a matching setter method annotated with {@link InitParam}.
*
* @param pConfig the servlet config
* @throws ServletException if an error ouccured during init
* @throws ServletException if an error occurred during init
*
* @see javax.servlet.GenericServlet#init
* @see #init() init
@@ -72,7 +72,7 @@ public abstract class HttpServlet extends javax.servlet.http.HttpServlet {
@Override
public void init(ServletConfig pConfig) throws ServletException {
if (pConfig == null) {
throw new ServletConfigException("servletconfig == null");
throw new ServletConfigException("servlet config == null");
}
try {

View File

@@ -36,7 +36,7 @@ import java.lang.annotation.*;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/InitParam.java#1 $
* @version $Id: InitParam.java#1 $
* @see com.twelvemonkeys.servlet.ServletConfigurator
* @see com.twelvemonkeys.servlet.GenericFilter#init(javax.servlet.FilterConfig)
* @see com.twelvemonkeys.servlet.GenericServlet#init(javax.servlet.ServletConfig)

View File

@@ -63,7 +63,7 @@ import java.io.OutputStream;
* </pre>
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/OutputStreamAdapter.java#1 $
* @version $Id: OutputStreamAdapter.java#1 $
*
*/
public class OutputStreamAdapter extends ServletOutputStream {

View File

@@ -66,7 +66,7 @@ import java.util.Enumeration;
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
*
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/ProxyServlet.java#1 $
* @version $Id: ProxyServlet.java#1 $
*/
public class ProxyServlet extends GenericServlet {

View File

@@ -34,10 +34,12 @@ import javax.servlet.ServletException;
* ServletConfigException.
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/ServletConfigException.java#2 $
* @version $Id: ServletConfigException.java#2 $
*/
public class ServletConfigException extends ServletException {
// TODO: Parameters for init-param at fault, and possibly servlet name?
/**
* Creates a {@code ServletConfigException} with the given message.
*
@@ -55,9 +57,8 @@ public class ServletConfigException extends ServletException {
*/
public ServletConfigException(final String pMessage, final Throwable pCause) {
super(pMessage, pCause);
if (getCause() == null) {
initCause(pCause);
}
maybeInitCause(pCause);
}
/**
@@ -66,7 +67,13 @@ public class ServletConfigException extends ServletException {
* @param pCause the exception cause
*/
public ServletConfigException(final Throwable pCause) {
super("Error in Servlet configuration: " + pCause.getMessage(), pCause);
super(String.format("Error in Servlet configuration: %s", pCause.getMessage()), pCause);
maybeInitCause(pCause);
}
private void maybeInitCause(Throwable pCause) {
// Workaround for ServletExceptions that does not do proper exception chaining
if (getCause() == null) {
initCause(pCause);
}

View File

@@ -45,7 +45,7 @@ import java.util.*;
* <p/>
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/ServletConfigMapAdapter.java#2 $
* @version $Id: ServletConfigMapAdapter.java#2 $
*/
class ServletConfigMapAdapter extends AbstractMap<String, String> implements Map<String, String>, Serializable, Cloneable {

View File

@@ -12,7 +12,7 @@ import java.util.Iterator;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/ServletHeadersMapAdapter.java#1 $
* @version $Id: ServletHeadersMapAdapter.java#1 $
*/
class ServletHeadersMapAdapter extends AbstractServletMapAdapter {

View File

@@ -12,7 +12,7 @@ import java.util.Iterator;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/ServletParametersMapAdapter.java#1 $
* @version $Id: ServletParametersMapAdapter.java#1 $
*/
class ServletParametersMapAdapter extends AbstractServletMapAdapter {

View File

@@ -42,7 +42,7 @@ import java.io.OutputStream;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/ServletResponseStreamDelegate.java#2 $
* @version $Id: ServletResponseStreamDelegate.java#2 $
*/
public class ServletResponseStreamDelegate {
private Object out = null;

View File

@@ -53,7 +53,7 @@ import java.util.Map;
* @author Harald Kuhr
* @author Eirik Torske
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/ServletUtil.java#3 $
* @version $Id: ServletUtil.java#3 $
*/
public final class ServletUtil {

View File

@@ -46,19 +46,16 @@ import java.util.Map;
/**
* ThrottleFilter, a filter for easing server during heavy load.
* <!--
* Renamed from LoadShutoffFilter...
* Happened to be listening to Xploding Plastix' Shakedown Shutoff at the time..
* -->
* Intercepts requests, and returns HTTP response code 503
* (Service Unavailable), if there are more than a given number of concurrent
* <p/>
* Intercepts requests, and returns HTTP response code {@code 503 (Service Unavailable)},
* if there are more than a given number of concurrent
* requests, to avoid large backlogs. The number of concurrent requests and the
* response messages sent to the user agent, is configurable from the web
* descriptor.
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/ThrottleFilter.java#1 $
* @version $Id: ThrottleFilter.java#1 $
* @see #setMaxConcurrentThreadCount
* @see #setResponseMessages
*/
@@ -195,7 +192,7 @@ public class ThrottleFilter extends GenericFilter {
/**
* Marks the beginning of a request
*
* @return <CODE>true<CODE> if the request should be handled.
* @return {@code true} if the request should be handled.
*/
private boolean beginRequest() {
synchronized (runningThreadsLock) {

View File

@@ -40,7 +40,7 @@ import java.io.IOException;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/TimingFilter.java#1 $
* @version $Id: TimingFilter.java#1 $
*/
public class TimingFilter extends GenericFilter {
@@ -102,8 +102,7 @@ public class TimingFilter extends GenericFilter {
}
long delta = end - start;
log("Request processing time for resource \"" + resourceURI + "\": " +
(delta - usage) + " ms (accumulated: " + delta + " ms).");
log(String.format("Request processing time for resource \"%s\": %d ms (accumulated: %d ms).", resourceURI, (delta - usage), delta));
// Store total usage
total += delta;

View File

@@ -109,7 +109,7 @@ import java.io.FilterOutputStream;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/TrimWhiteSpaceFilter.java#2 $
* @version $Id: TrimWhiteSpaceFilter.java#2 $
*/
public class TrimWhiteSpaceFilter extends GenericFilter {

View File

@@ -9,7 +9,7 @@ import java.net.URI;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/cache/AbstractCacheRequest.java#1 $
* @version $Id: AbstractCacheRequest.java#1 $
*/
public abstract class AbstractCacheRequest implements CacheRequest {
private final URI requestURI;

View File

@@ -7,7 +7,7 @@ import java.util.*;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/cache/AbstractCacheResponse.java#1 $
* @version $Id: AbstractCacheResponse.java#1 $
*/
public abstract class AbstractCacheResponse implements CacheResponse {
private int status;
@@ -32,10 +32,12 @@ public abstract class AbstractCacheResponse implements CacheResponse {
private void setHeader(String pHeaderName, String pHeaderValue, boolean pAdd) {
List<String> values = pAdd ? headers.get(pHeaderName) : null;
if (values == null) {
values = new ArrayList<String>();
headers.put(pHeaderName, values);
}
values.add(pHeaderValue);
}

View File

@@ -5,7 +5,7 @@ package com.twelvemonkeys.servlet.cache;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheException.java#1 $
* @version $Id: CacheException.java#1 $
*/
public class CacheException extends Exception {
public CacheException(Throwable pCause) {

View File

@@ -52,7 +52,7 @@ import java.util.logging.Logger;
* @author Jayson Falkner
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheFilter.java#4 $
* @version $Id: CacheFilter.java#4 $
*
*/
public class CacheFilter extends GenericFilter {

View File

@@ -9,7 +9,7 @@ import java.util.Map;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheRequest.java#1 $
* @version $Id: CacheRequest.java#1 $
*/
public interface CacheRequest {
URI getRequestURI();

View File

@@ -10,7 +10,7 @@ import java.util.Map;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheResponse.java#1 $
* @version $Id: CacheResponse.java#1 $
*/
public interface CacheResponse {
OutputStream getOutputStream() throws IOException;

View File

@@ -49,7 +49,7 @@ import java.io.PrintWriter;
* @author Jayson Falkner
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheResponseWrapper.java#3 $
* @version $Id: CacheResponseWrapper.java#3 $
*/
class CacheResponseWrapper extends HttpServletResponseWrapper {
private ServletResponseStreamDelegate streamDelegate;
@@ -58,7 +58,7 @@ class CacheResponseWrapper extends HttpServletResponseWrapper {
private CachedEntity cached;
private WritableCachedResponse cachedResponse;
private Boolean cachable;
private Boolean cacheable;
private int status;
public CacheResponseWrapper(final ServletCacheResponse pResponse, final CachedEntity pCached) {
@@ -75,14 +75,14 @@ class CacheResponseWrapper extends HttpServletResponseWrapper {
methods below.
*/
private void init() {
cachable = null;
cacheable = null;
status = SC_OK;
cachedResponse = cached.createCachedResponse();
streamDelegate = new ServletResponseStreamDelegate(this) {
protected OutputStream createOutputStream() throws IOException {
// Test if this request is really cacheable, otherwise,
// just write through to underlying response, and don't cache
if (isCachable()) {
if (isCacheable()) {
return cachedResponse.getOutputStream();
}
else {
@@ -98,16 +98,16 @@ class CacheResponseWrapper extends HttpServletResponseWrapper {
return cachedResponse.getCachedResponse();
}
public boolean isCachable() {
public boolean isCacheable() {
// NOTE: Intentionally not synchronized
if (cachable == null) {
cachable = isCachableImpl();
if (cacheable == null) {
cacheable = isCacheableImpl();
}
return cachable;
return cacheable;
}
private boolean isCachableImpl() {
private boolean isCacheableImpl() {
if (status != SC_OK) {
return false;
}
@@ -157,10 +157,10 @@ class CacheResponseWrapper extends HttpServletResponseWrapper {
}
public void reset() {
if (Boolean.FALSE.equals(cachable)) {
if (Boolean.FALSE.equals(cacheable)) {
super.reset();
}
// No else, might be cachable after all..
// No else, might be cacheable after all..
init();
}
@@ -177,13 +177,13 @@ class CacheResponseWrapper extends HttpServletResponseWrapper {
}
public void sendError(int pStatusCode, String msg) throws IOException {
// NOT cachable
// NOT cacheable
status = pStatusCode;
super.sendError(pStatusCode, msg);
}
public void sendError(int pStatusCode) throws IOException {
// NOT cachable
// NOT cacheable
status = pStatusCode;
super.sendError(pStatusCode);
}
@@ -194,7 +194,7 @@ class CacheResponseWrapper extends HttpServletResponseWrapper {
}
public void setStatus(int pStatusCode) {
// NOT cachable unless pStatusCode == 200 (or a FEW others?)
// NOT cacheable unless pStatusCode == 200 (or a FEW others?)
if (pStatusCode != SC_OK) {
status = pStatusCode;
super.setStatus(pStatusCode);
@@ -202,14 +202,14 @@ class CacheResponseWrapper extends HttpServletResponseWrapper {
}
public void sendRedirect(String pLocation) throws IOException {
// NOT cachable
// NOT cacheable
status = SC_MOVED_TEMPORARILY;
super.sendRedirect(pLocation);
}
public void setDateHeader(String pName, long pValue) {
// If in write-trough-mode, set headers directly
if (Boolean.FALSE.equals(cachable)) {
if (Boolean.FALSE.equals(cacheable)) {
super.setDateHeader(pName, pValue);
}
cachedResponse.setHeader(pName, NetUtil.formatHTTPDate(pValue));
@@ -217,7 +217,7 @@ class CacheResponseWrapper extends HttpServletResponseWrapper {
public void addDateHeader(String pName, long pValue) {
// If in write-trough-mode, set headers directly
if (Boolean.FALSE.equals(cachable)) {
if (Boolean.FALSE.equals(cacheable)) {
super.addDateHeader(pName, pValue);
}
cachedResponse.addHeader(pName, NetUtil.formatHTTPDate(pValue));
@@ -225,7 +225,7 @@ class CacheResponseWrapper extends HttpServletResponseWrapper {
public void setHeader(String pName, String pValue) {
// If in write-trough-mode, set headers directly
if (Boolean.FALSE.equals(cachable)) {
if (Boolean.FALSE.equals(cacheable)) {
super.setHeader(pName, pValue);
}
cachedResponse.setHeader(pName, pValue);
@@ -233,7 +233,7 @@ class CacheResponseWrapper extends HttpServletResponseWrapper {
public void addHeader(String pName, String pValue) {
// If in write-trough-mode, set headers directly
if (Boolean.FALSE.equals(cachable)) {
if (Boolean.FALSE.equals(cacheable)) {
super.addHeader(pName, pValue);
}
cachedResponse.addHeader(pName, pValue);
@@ -241,7 +241,7 @@ class CacheResponseWrapper extends HttpServletResponseWrapper {
public void setIntHeader(String pName, int pValue) {
// If in write-trough-mode, set headers directly
if (Boolean.FALSE.equals(cachable)) {
if (Boolean.FALSE.equals(cacheable)) {
super.setIntHeader(pName, pValue);
}
cachedResponse.setHeader(pName, String.valueOf(pValue));
@@ -249,7 +249,7 @@ class CacheResponseWrapper extends HttpServletResponseWrapper {
public void addIntHeader(String pName, int pValue) {
// If in write-trough-mode, set headers directly
if (Boolean.FALSE.equals(cachable)) {
if (Boolean.FALSE.equals(cacheable)) {
super.addIntHeader(pName, pValue);
}
cachedResponse.addHeader(pName, String.valueOf(pValue));

View File

@@ -34,7 +34,7 @@ import java.io.IOException;
* CachedEntity
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/cache/CachedEntity.java#3 $
* @version $Id: CachedEntity.java#3 $
*/
interface CachedEntity {

View File

@@ -38,7 +38,7 @@ import java.util.List;
* CachedEntity
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/cache/CachedEntityImpl.java#3 $
* @version $Id: CachedEntityImpl.java#3 $
*/
class CachedEntityImpl implements CachedEntity {
private String cacheURI;
@@ -131,7 +131,7 @@ class CachedEntityImpl implements CachedEntity {
//
// CacheResponseWrapper response = (CacheResponseWrapper) pResponse;
// if (response.isCachable()) {
// if (response.isCacheable()) {
cache.registerContent(
cacheURI,
pRequest,

View File

@@ -35,7 +35,7 @@ import java.io.OutputStream;
* CachedResponse
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/cache/CachedResponse.java#3 $
* @version $Id: CachedResponse.java#3 $
*/
interface CachedResponse {
/**

View File

@@ -30,7 +30,6 @@ package com.twelvemonkeys.servlet.cache;
import com.twelvemonkeys.io.FastByteArrayOutputStream;
import com.twelvemonkeys.lang.Validate;
import com.twelvemonkeys.util.LinkedMap;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -41,7 +40,7 @@ import java.util.*;
* CachedResponseImpl
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/cache/CachedResponseImpl.java#4 $
* @version $Id: CachedResponseImpl.java#4 $
*/
class CachedResponseImpl implements CachedResponse {
final protected Map<String, List<String>> headers;
@@ -54,7 +53,7 @@ class CachedResponseImpl implements CachedResponse {
}
// For use by HTTPCache, when recreating CachedResponses from disk cache
CachedResponseImpl(final int pStatus, final LinkedMap<String, List<String>> pHeaders, final int pHeaderSize, final byte[] pContent) {
CachedResponseImpl(final int pStatus, final LinkedHashMap<String, List<String>> pHeaders, final int pHeaderSize, final byte[] pContent) {
status = pStatus;
headers = Validate.notNull(pHeaders, "headers");
headersSize = pHeaderSize;
@@ -85,6 +84,7 @@ class CachedResponseImpl implements CachedResponse {
for (int i = 0; i < headerValues.length; i++) {
String headerValue = headerValues[i];
if (i == 0) {
pResponse.setHeader(header, headerValue);
}
@@ -116,6 +116,7 @@ class CachedResponseImpl implements CachedResponse {
*/
public String[] getHeaderNames() {
Set<String> headers = this.headers.keySet();
return headers.toArray(new String[headers.size()]);
}
@@ -130,12 +131,7 @@ class CachedResponseImpl implements CachedResponse {
public String[] getHeaderValues(final String pHeaderName) {
List<String> values = headers.get(pHeaderName);
if (values == null) {
return null;
}
else {
return values.toArray(new String[values.size()]);
}
return values == null ? null : values.toArray(new String[values.size()]);
}
/**

View File

@@ -10,7 +10,7 @@ import java.util.Map;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/cache/ClientCacheRequest.java#1 $
* @version $Id: ClientCacheRequest.java#1 $
*/
public final class ClientCacheRequest extends AbstractCacheRequest {
private Map<String, List<String>> parameters;

View File

@@ -9,7 +9,7 @@ import java.io.OutputStream;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/cache/ClientCacheResponse.java#2 $
* @version $Id: ClientCacheResponse.java#2 $
*/
public final class ClientCacheResponse extends AbstractCacheResponse {
// It's quite useless to cache the data either on disk or in memory, as it already is cached in the client's cache...

View File

@@ -34,10 +34,10 @@ import com.twelvemonkeys.lang.Validate;
import com.twelvemonkeys.net.MIMEUtil;
import com.twelvemonkeys.net.NetUtil;
import com.twelvemonkeys.util.LRUHashMap;
import com.twelvemonkeys.util.LinkedMap;
import com.twelvemonkeys.util.NullMap;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.*;
import java.util.logging.Level;
@@ -48,7 +48,7 @@ import java.util.logging.Logger;
* <p/>
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/cache/HTTPCache.java#4 $
* @version $Id: HTTPCache.java#4 $
* @todo OMPTIMIZE: Cache parsed vary-info objects, not the properties-files
* @todo BUG: Better filename handling, as some filenames become too long..
* - Use a mix of parameters and hashcode + lenght with fixed (max) lenght?
@@ -149,8 +149,6 @@ public class HTTPCache {
*/
protected static final String FILE_EXT_VARY = ".vary";
protected static final int STATUS_OK = 200;
/**
* The directory used for the disk-based cache
*/
@@ -446,7 +444,7 @@ public class HTTPCache {
}
private boolean isCachable(final CacheResponse pResponse) {
if (pResponse.getStatus() != STATUS_OK) {
if (pResponse.getStatus() != HttpServletResponse.SC_OK) {
return false;
}
@@ -898,7 +896,7 @@ public class HTTPCache {
int headerSize = (int) headers.length();
BufferedReader reader = new BufferedReader(new FileReader(headers));
LinkedMap<String, List<String>> headerMap = new LinkedMap<String, List<String>>();
LinkedHashMap<String, List<String>> headerMap = new LinkedHashMap<String, List<String>>();
String line;
while ((line = reader.readLine()) != null) {
int colIdx = line.indexOf(':');
@@ -916,7 +914,7 @@ public class HTTPCache {
headerMap.put(name, Arrays.asList(StringUtil.toStringArray(value, "\\")));
}
response = new CachedResponseImpl(STATUS_OK, headerMap, headerSize, contents);
response = new CachedResponseImpl(HttpServletResponse.SC_OK, headerMap, headerSize, contents);
contentCache.put(pCacheURI + '.' + FileUtil.getExtension(content), response);
}
}

View File

@@ -7,7 +7,7 @@ import java.io.IOException;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/cache/ResponseResolver.java#2 $
* @version $Id: ResponseResolver.java#2 $
*/
public interface ResponseResolver {
void resolve(CacheRequest pRequest, CacheResponse pResponse) throws IOException, CacheException;

View File

@@ -52,14 +52,14 @@ import java.util.Map;
* @author Jayson Falkner
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/cache/SerlvetCacheResponseWrapper.java#2 $
* @version $Id: SerlvetCacheResponseWrapper.java#2 $
*/
class SerlvetCacheResponseWrapper extends HttpServletResponseWrapper {
private ServletResponseStreamDelegate streamDelegate;
private CacheResponse cacheResponse;
private Boolean cachable;
private Boolean cacheable;
private int status;
public SerlvetCacheResponseWrapper(final HttpServletResponse pServletResponse, final CacheResponse pResponse) {
@@ -70,19 +70,19 @@ class SerlvetCacheResponseWrapper extends HttpServletResponseWrapper {
/*
NOTE: This class defers determining if a response is cachable until the
NOTE: This class defers determining if a response is cacheable until the
output stream is needed.
This it the reason for the somewhat complicated logic in the add/setHeader
methods below.
*/
private void init() {
cachable = null;
cacheable = null;
status = SC_OK;
streamDelegate = new ServletResponseStreamDelegate(this) {
protected OutputStream createOutputStream() throws IOException {
// Test if this request is really cachable, otherwise,
// Test if this request is really cacheable, otherwise,
// just write through to underlying response, and don't cache
if (isCachable()) {
if (isCacheable()) {
return cacheResponse.getOutputStream();
}
else {
@@ -109,16 +109,16 @@ class SerlvetCacheResponseWrapper extends HttpServletResponseWrapper {
}
}
public boolean isCachable() {
public boolean isCacheable() {
// NOTE: Intentionally not synchronized
if (cachable == null) {
cachable = isCachableImpl();
if (cacheable == null) {
cacheable = isCacheableImpl();
}
return cachable;
return cacheable;
}
private boolean isCachableImpl() {
private boolean isCacheableImpl() {
// TODO: This code is duped in the cache...
if (status != SC_OK) {
return false;
@@ -169,10 +169,10 @@ class SerlvetCacheResponseWrapper extends HttpServletResponseWrapper {
}
public void reset() {
if (Boolean.FALSE.equals(cachable)) {
if (Boolean.FALSE.equals(cacheable)) {
super.reset();
}
// No else, might be cachable after all..
// No else, might be cacheable after all..
init();
}
@@ -189,13 +189,13 @@ class SerlvetCacheResponseWrapper extends HttpServletResponseWrapper {
}
public void sendError(int pStatusCode, String msg) throws IOException {
// NOT cachable
// NOT cacheable
status = pStatusCode;
super.sendError(pStatusCode, msg);
}
public void sendError(int pStatusCode) throws IOException {
// NOT cachable
// NOT cacheable
status = pStatusCode;
super.sendError(pStatusCode);
}
@@ -206,7 +206,7 @@ class SerlvetCacheResponseWrapper extends HttpServletResponseWrapper {
}
public void setStatus(int pStatusCode) {
// NOT cachable unless pStatusCode == 200 (or a FEW others?)
// NOT cacheable unless pStatusCode == 200 (or a FEW others?)
if (pStatusCode != SC_OK) {
status = pStatusCode;
super.setStatus(pStatusCode);
@@ -214,14 +214,14 @@ class SerlvetCacheResponseWrapper extends HttpServletResponseWrapper {
}
public void sendRedirect(String pLocation) throws IOException {
// NOT cachable
// NOT cacheable
status = SC_MOVED_TEMPORARILY;
super.sendRedirect(pLocation);
}
public void setDateHeader(String pName, long pValue) {
// If in write-trough-mode, set headers directly
if (Boolean.FALSE.equals(cachable)) {
if (Boolean.FALSE.equals(cacheable)) {
super.setDateHeader(pName, pValue);
}
cacheResponse.setHeader(pName, NetUtil.formatHTTPDate(pValue));
@@ -229,7 +229,7 @@ class SerlvetCacheResponseWrapper extends HttpServletResponseWrapper {
public void addDateHeader(String pName, long pValue) {
// If in write-trough-mode, set headers directly
if (Boolean.FALSE.equals(cachable)) {
if (Boolean.FALSE.equals(cacheable)) {
super.addDateHeader(pName, pValue);
}
cacheResponse.addHeader(pName, NetUtil.formatHTTPDate(pValue));
@@ -237,7 +237,7 @@ class SerlvetCacheResponseWrapper extends HttpServletResponseWrapper {
public void setHeader(String pName, String pValue) {
// If in write-trough-mode, set headers directly
if (Boolean.FALSE.equals(cachable)) {
if (Boolean.FALSE.equals(cacheable)) {
super.setHeader(pName, pValue);
}
cacheResponse.setHeader(pName, pValue);
@@ -245,7 +245,7 @@ class SerlvetCacheResponseWrapper extends HttpServletResponseWrapper {
public void addHeader(String pName, String pValue) {
// If in write-trough-mode, set headers directly
if (Boolean.FALSE.equals(cachable)) {
if (Boolean.FALSE.equals(cacheable)) {
super.addHeader(pName, pValue);
}
cacheResponse.addHeader(pName, pValue);
@@ -253,7 +253,7 @@ class SerlvetCacheResponseWrapper extends HttpServletResponseWrapper {
public void setIntHeader(String pName, int pValue) {
// If in write-trough-mode, set headers directly
if (Boolean.FALSE.equals(cachable)) {
if (Boolean.FALSE.equals(cacheable)) {
super.setIntHeader(pName, pValue);
}
cacheResponse.setHeader(pName, String.valueOf(pValue));
@@ -261,7 +261,7 @@ class SerlvetCacheResponseWrapper extends HttpServletResponseWrapper {
public void addIntHeader(String pName, int pValue) {
// If in write-trough-mode, set headers directly
if (Boolean.FALSE.equals(cachable)) {
if (Boolean.FALSE.equals(cacheable)) {
super.addIntHeader(pName, pValue);
}
cacheResponse.addHeader(pName, String.valueOf(pValue));

View File

@@ -12,7 +12,7 @@ import java.util.Map;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/cache/ServletCacheRequest.java#1 $
* @version $Id: ServletCacheRequest.java#1 $
*/
public final class ServletCacheRequest extends AbstractCacheRequest {
private final HttpServletRequest request;

View File

@@ -9,38 +9,38 @@ import java.io.OutputStream;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/cache/ServletCacheResponse.java#2 $
* @version $Id: ServletCacheResponse.java#2 $
*/
public final class ServletCacheResponse extends AbstractCacheResponse {
private HttpServletResponse mResponse;
private HttpServletResponse response;
public ServletCacheResponse(HttpServletResponse pResponse) {
mResponse = pResponse;
response = pResponse;
}
public OutputStream getOutputStream() throws IOException {
return mResponse.getOutputStream();
return response.getOutputStream();
}
@Override
public void setStatus(int pStatusCode) {
mResponse.setStatus(pStatusCode);
response.setStatus(pStatusCode);
super.setStatus(pStatusCode);
}
@Override
public void addHeader(String pHeaderName, String pHeaderValue) {
mResponse.addHeader(pHeaderName, pHeaderValue);
response.addHeader(pHeaderName, pHeaderValue);
super.addHeader(pHeaderName, pHeaderValue);
}
@Override
public void setHeader(String pHeaderName, String pHeaderValue) {
mResponse.setHeader(pHeaderName, pHeaderValue);
response.setHeader(pHeaderName, pHeaderValue);
super.setHeader(pHeaderName, pHeaderValue);
}
HttpServletResponse getResponse() {
return mResponse;
return response;
}
}

View File

@@ -10,7 +10,7 @@ import java.io.IOException;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/cache/ServletResponseResolver.java#2 $
* @version $Id: ServletResponseResolver.java#2 $
*/
final class ServletResponseResolver implements ResponseResolver {
final private ServletCacheRequest request;

View File

@@ -34,7 +34,7 @@ import java.io.OutputStream;
* WritableCachedResponse
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/cache/WritableCachedResponse.java#2 $
* @version $Id: WritableCachedResponse.java#2 $
*/
public interface WritableCachedResponse extends CachedResponse, CacheResponse {
/**

View File

@@ -42,7 +42,7 @@ import java.util.Map;
* WritableCachedResponseImpl
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/cache/WritableCachedResponseImpl.java#3 $
* @version $Id: WritableCachedResponseImpl.java#3 $
*/
class WritableCachedResponseImpl implements WritableCachedResponse {
private final CachedResponseImpl cachedResponse;
@@ -81,10 +81,7 @@ class WritableCachedResponseImpl implements WritableCachedResponse {
private void setHeader(String pName, String pValue, boolean pAdd) {
// System.out.println(" ++ CachedResponse ++ " + (pAdd ? "addHeader(" : "setHeader(") + pName + ", " + pValue + ")");
// If adding, get list and append, otherwise replace list
List<String> values = null;
if (pAdd) {
values = cachedResponse.headers.get(pName);
}
List<String> values = pAdd ? cachedResponse.headers.get(pName) : null;
if (values == null) {
values = new ArrayList<String>();
@@ -96,6 +93,7 @@ class WritableCachedResponseImpl implements WritableCachedResponse {
else {
// Remove length of potential replaced old values + pName
String[] oldValues = getHeaderValues(pName);
if (oldValues != null) {
for (String oldValue : oldValues) {
cachedResponse.headersSize -= oldValue.length();

View File

@@ -33,7 +33,7 @@ package com.twelvemonkeys.servlet.fileupload;
* <p/>
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/FileSizeExceededException.java#1 $
* @version $Id: FileSizeExceededException.java#1 $
*/
public class FileSizeExceededException extends FileUploadException {
public FileSizeExceededException(Throwable pCause) {

View File

@@ -35,7 +35,7 @@ import javax.servlet.ServletException;
* <p/>
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/FileUploadException.java#1 $
* @version $Id: FileUploadException.java#1 $
*/
public class FileUploadException extends ServletException {
public FileUploadException(String pMessage) {

View File

@@ -51,7 +51,7 @@ import java.net.MalformedURLException;
* @see HttpFileUploadRequest
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/FileUploadFilter.java#1 $
* @version $Id: FileUploadFilter.java#1 $
*/
public class FileUploadFilter extends GenericFilter {
private File uploadDir;

View File

@@ -35,7 +35,7 @@ import javax.servlet.http.HttpServletRequest;
* <a href="http://www.ietf.org/rfc/rfc1867.txt">Form-based File Upload in HTML (RFC1867)</a>.
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/HttpFileUploadRequest.java#1 $
* @version $Id: HttpFileUploadRequest.java#1 $
*/
public interface HttpFileUploadRequest extends HttpServletRequest {
/**

View File

@@ -43,7 +43,7 @@ import java.util.*;
* <a href="http://jakarta.apache.org/commons/fileupload/">Jakarta Commons FileUpload</a>.
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/HttpFileUploadRequestWrapper.java#1 $
* @version $Id: HttpFileUploadRequestWrapper.java#1 $
*/
class HttpFileUploadRequestWrapper extends HttpServletRequestWrapper implements HttpFileUploadRequest {

View File

@@ -36,7 +36,7 @@ import java.io.IOException;
* This class represents an uploaded file.
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/UploadedFile.java#1 $
* @version $Id: UploadedFile.java#1 $
*/
public interface UploadedFile {
/**

View File

@@ -40,7 +40,7 @@ import java.io.File;
* <a href="http://jakarta.apache.org/commons/fileupload/">Jakarta Commons FileUpload</a>.
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/UploadedFileImpl.java#1 $
* @version $Id: UploadedFileImpl.java#1 $
*/
class UploadedFileImpl implements UploadedFile {
private final FileItem item;

View File

@@ -104,7 +104,7 @@ import java.io.IOException;
* @author Jayson Falkner
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/gzip/GZIPFilter.java#1 $
* @version $Id: GZIPFilter.java#1 $
*/
public class GZIPFilter extends GenericFilter {
@@ -120,22 +120,23 @@ public class GZIPFilter extends GenericFilter {
// If GZIP is supported, use compression
String accept = request.getHeader("Accept-Encoding");
if (accept != null && accept.indexOf("gzip") != -1) {
if (accept != null && accept.contains("gzip")) {
//System.out.println("GZIP supported, compressing.");
// TODO: Set Vary: Accept-Encoding ?!
GZIPResponseWrapper wrapped = new GZIPResponseWrapper(response);
try {
pChain.doFilter(pRequest, wrapped);
}
finally {
wrapped.flushResponse();
}
return;
}
}
// Else, contiue chain
// Else, continue chain
pChain.doFilter(pRequest, pResponse);
}
}

View File

@@ -48,7 +48,7 @@ import java.util.zip.GZIPOutputStream;
* @author Jayson Falkner
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/gzip/GZIPResponseWrapper.java#1 $
* @version $Id: GZIPResponseWrapper.java#1 $
*/
public class GZIPResponseWrapper extends HttpServletResponseWrapper {
protected ServletOutputStream out;
@@ -121,7 +121,8 @@ public class GZIPResponseWrapper extends HttpServletResponseWrapper {
if (out == null) {
out = createOutputStream();
}
return (out);
return out;
}
public PrintWriter getWriter() throws IOException {
@@ -134,9 +135,11 @@ public class GZIPResponseWrapper extends HttpServletResponseWrapper {
}
out = createOutputStream();
// TODO: This is wrong. Should use getCharacterEncoding() or "ISO-8859-1" if gCE returns null.
// TODO: This is wrong. Should use getCharacterEncoding() or "ISO-8859-1" if getCE returns null.
writer = new PrintWriter(new OutputStreamWriter(out, "UTF-8"));
return (writer);
return writer;
}
public void setContentLength(int pLength) {

View File

@@ -38,8 +38,8 @@ import java.awt.image.RenderedImage;
/**
* AWTImageFilterAdapter
*
* @author $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/image/AWTImageFilterAdapter.java#1 $
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: AWTImageFilterAdapter.java#1 $
*
*/
public class AWTImageFilterAdapter extends ImageFilter {
@@ -67,6 +67,6 @@ public class AWTImageFilterAdapter extends ImageFilter {
Image img = ImageUtil.filter(pImage, imageFilter);
// Create BufferedImage & return
return ImageUtil.toBuffered(img, BufferedImage.TYPE_INT_RGB); // TODO: This is for JPEG only...
return ImageUtil.toBuffered(img, BufferedImage.TYPE_INT_RGB); // TODO: This is ok for JPEG only...
}
}

View File

@@ -36,8 +36,8 @@ import java.awt.image.RenderedImage;
/**
* BufferedImageOpAdapter
*
* @author $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/image/BufferedImageOpAdapter.java#1 $
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: BufferedImageOpAdapter.java#1 $
*
*/
public class BufferedImageOpAdapter extends ImageFilter {

View File

@@ -47,7 +47,7 @@ import java.util.zip.CRC32;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/image/ColorServlet.java#2 $
* @version $Id: ColorServlet.java#2 $
*/
public class ColorServlet extends GenericServlet {
private final static String RGB_PARAME = "color";

View File

@@ -38,7 +38,7 @@ import java.io.IOException;
* <p/>
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/image/ComposeFilter.java#1 $
* @version $Id: ComposeFilter.java#1 $
*/
public class ComposeFilter extends ImageFilter {
protected RenderedImage doFilter(BufferedImage pImage, ServletRequest pRequest, ImageServletResponse pResponse) throws IOException {

View File

@@ -54,6 +54,9 @@ import java.util.*;
* unneccessary conversion (as IE supports PNG, the latests FireFox supports
* JPEG and GIF, etc. even though they both don't explicitly list these formats
* in their Accept headers).
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: ContentNegotiationFilter.java#1 $
*/
public class ContentNegotiationFilter extends ImageFilter {

View File

@@ -91,7 +91,7 @@ import java.awt.image.RenderedImage;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/image/CropFilter.java#1 $
* @version $Id: CropFilter.java#1 $
*/
public class CropFilter extends ScaleFilter {
/** {@code cropX}*/

View File

@@ -45,7 +45,7 @@ import java.io.IOException;
* @see #doFilter(java.awt.image.BufferedImage,javax.servlet.ServletRequest,ImageServletResponse)
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageFilter.java#2 $
* @version $Id: ImageFilter.java#2 $
*
*/
public abstract class ImageFilter extends GenericFilter {

View File

@@ -31,13 +31,13 @@ package com.twelvemonkeys.servlet.image;
import javax.servlet.*;
/**
* This excpetion is a subclass of ServletException, and acts just as a marker
* for excpetions thrown by the ImageServlet API.
* This exception is a subclass of ServletException, and acts just as a marker
* for exceptions thrown by the ImageServlet API.
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
*
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletException.java#2 $
* @version $Id: ImageServletException.java#2 $
*/
public class ImageServletException extends ServletException {

View File

@@ -41,7 +41,7 @@ import java.awt.image.BufferedImage;
* {@link #getImage()} to have any effect.
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletResponse.java#4 $
* @version $Id: ImageServletResponse.java#4 $
*/
public interface ImageServletResponse extends ServletResponse {
/**

View File

@@ -65,7 +65,7 @@ import java.util.Iterator;
* <p>
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletResponseImpl.java#10 $
* @version $Id: ImageServletResponseImpl.java#10 $
*
*/
// TODO: Refactor out HTTP specifics (if possible).
@@ -178,6 +178,20 @@ class ImageServletResponseImpl extends HttpServletResponseWrapper implements Ima
originalContentLength = pLength;
}
@Override
public void setHeader(String name, String value) {
// NOTE: Clients could also specify content type/content length using the setHeader method, special handling
if (name != null && name.equals("Content-Length")) {
setContentLength(Integer.valueOf(value)); // Value might be too large, but we don't support that anyway
}
else if (name != null && name.equals("Content-Type")) {
setContentType(value);
}
else {
super.setHeader(name, value);
}
}
/**
* Writes the image to the original {@code ServletOutputStream}.
* If no format is set in this response, the image is encoded in the same
@@ -211,14 +225,56 @@ class ImageServletResponseImpl extends HttpServletResponseWrapper implements Ima
Float requestQuality = (Float) originalRequest.getAttribute(ImageServletResponse.ATTRIB_OUTPUT_QUALITY);
// The default JPEG quality is not good enough, so always apply compression
// The default JPEG quality is not good enough, so always adjust compression/quality
if ((requestQuality != null || "jpeg".equalsIgnoreCase(getFormatNameSafe(writer))) && param.canWriteCompressed()) {
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
// WORKAROUND: Known bug in GIFImageWriter in certain JDK versions, compression type is not set
if (param.getCompressionTypes() != null && param.getCompressionType() == null) {
param.setCompressionType(param.getCompressionTypes()[0]); // Just choose any, to keep param happy
}
param.setCompressionQuality(requestQuality != null ? requestQuality : 0.8f);
}
if ("gif".equalsIgnoreCase(getFormatNameSafe(writer)) && !(image.getColorModel() instanceof IndexColorModel)
&& image.getColorModel().getTransparency() != Transparency.OPAQUE) {
// WORKAROUND: Bug in GIFImageWriter may throw NPE if transparent pixels
// http://bugs.sun.com/view_bug.do?bug_id=6287936
image = ImageUtil.createIndexed(ImageUtil.toBuffered(image), 256, null, ImageUtil.TRANSPARENCY_BITMASK);
}
//////////////////
ImageOutputStream stream = ImageIO.createImageOutputStream(out);
/*
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
JScrollPane scroll = new JScrollPane(new JLabel(new BufferedImageIcon(ImageUtil.toBuffered(image))) {
{
setOpaque(true);
setBackground(Color.ORANGE);
}
});
scroll.setBorder(BorderFactory.createEmptyBorder());
JOptionPane.showMessageDialog(null, scroll);
}
});
}
catch (InterruptedException ignore) {
}
catch (InvocationTargetException ignore) {
}
image = ImageUtil.createIndexed(ImageUtil.toBuffered(image));
// */
// Bug in GIF writer, if pixel at 0,0 is transparent.. :-P
// BufferedImage bufferedImage = ImageUtil.toBuffered(image);
// bufferedImage.setRGB(0, 0, bufferedImage.getRGB(0, 0) | 0xFF000000);
// image = bufferedImage;
writer.setOutput(stream);
try {
writer.write(null, new IIOImage(image, null, null), param);

View File

@@ -35,8 +35,8 @@ import java.awt.image.RenderedImage;
/**
* An {@code ImageFilter} that does nothing. Useful for debugging purposes.
*
* @author $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/image/NullImageFilter.java#2 $
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: NullImageFilter.java $
*
*/
public final class NullImageFilter extends ImageFilter {

View File

@@ -78,7 +78,7 @@ import java.awt.image.RenderedImage;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/image/RotateFilter.java#1 $
* @version $Id: RotateFilter.java#1 $
*/
public class RotateFilter extends ImageFilter {

View File

@@ -69,7 +69,7 @@ import java.lang.reflect.Field;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/image/ScaleFilter.java#1 $
* @version $Id: ScaleFilter.java#1 $
*
* @example &lt;IMG src="/scale/test.jpg?scaleX=500&scaleUniform=false"&gt;
* @example &lt;IMG src="/scale/test.png?scaleY=50&scaleUnits=PERCENT"&gt;

View File

@@ -21,69 +21,69 @@ import java.io.IOException;
* @see ImageServletResponse#ATTRIB_AOI
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/image/SourceRenderFilter.java#1 $
* @version $Id: SourceRenderFilter.java#1 $
*/
public class SourceRenderFilter extends ImageFilter {
private String mSizeWidthParam = "size.w";
private String mSizeHeightParam = "size.h";
private String mSizePercentParam = "size.percent";
private String mSizeUniformParam = "size.uniform";
private String sizeWidthParam = "size.w";
private String sizeHeightParam = "size.h";
private String sizePercentParam = "size.percent";
private String sizeUniformParam = "size.uniform";
private String mRegionWidthParam = "aoi.w";
private String mRegionHeightParam = "aoi.h";
private String mRegionLeftParam = "aoi.x";
private String mRegionTopParam = "aoi.y";
private String mRegionPercentParam = "aoi.percent";
private String mRegionUniformParam = "aoi.uniform";
private String regionWidthParam = "aoi.w";
private String regionHeightParam = "aoi.h";
private String regionLeftParam = "aoi.x";
private String regionTopParam = "aoi.y";
private String regionPercentParam = "aoi.percent";
private String regionUniformParam = "aoi.uniform";
public void setRegionHeightParam(String pRegionHeightParam) {
mRegionHeightParam = pRegionHeightParam;
regionHeightParam = pRegionHeightParam;
}
public void setRegionWidthParam(String pRegionWidthParam) {
mRegionWidthParam = pRegionWidthParam;
regionWidthParam = pRegionWidthParam;
}
public void setRegionLeftParam(String pRegionLeftParam) {
mRegionLeftParam = pRegionLeftParam;
regionLeftParam = pRegionLeftParam;
}
public void setRegionTopParam(String pRegionTopParam) {
mRegionTopParam = pRegionTopParam;
regionTopParam = pRegionTopParam;
}
public void setSizeHeightParam(String pSizeHeightParam) {
mSizeHeightParam = pSizeHeightParam;
sizeHeightParam = pSizeHeightParam;
}
public void setSizeWidthParam(String pSizeWidthParam) {
mSizeWidthParam = pSizeWidthParam;
sizeWidthParam = pSizeWidthParam;
}
public void setRegionPercentParam(String pRegionPercentParam) {
mRegionPercentParam = pRegionPercentParam;
regionPercentParam = pRegionPercentParam;
}
public void setRegionUniformParam(String pRegionUniformParam) {
mRegionUniformParam = pRegionUniformParam;
regionUniformParam = pRegionUniformParam;
}
public void setSizePercentParam(String pSizePercentParam) {
mSizePercentParam = pSizePercentParam;
sizePercentParam = pSizePercentParam;
}
public void setSizeUniformParam(String pSizeUniformParam) {
mSizeUniformParam = pSizeUniformParam;
sizeUniformParam = pSizeUniformParam;
}
public void init() throws ServletException {
if (triggerParams == null) {
// Add all params as triggers
triggerParams = new String[]{mSizeWidthParam, mSizeHeightParam,
mSizeUniformParam, mSizePercentParam,
mRegionLeftParam, mRegionTopParam,
mRegionWidthParam, mRegionHeightParam,
mRegionUniformParam, mRegionPercentParam};
triggerParams = new String[]{sizeWidthParam, sizeHeightParam,
sizeUniformParam, sizePercentParam,
regionLeftParam, regionTopParam,
regionWidthParam, regionHeightParam,
regionUniformParam, regionPercentParam};
}
}
@@ -101,37 +101,37 @@ public class SourceRenderFilter extends ImageFilter {
// TODO: Max size configuration, to avoid DOS attacks? OutOfMemory
// Size parameters
int width = ServletUtil.getIntParameter(pRequest, mSizeWidthParam, -1);
int height = ServletUtil.getIntParameter(pRequest, mSizeHeightParam, -1);
int width = ServletUtil.getIntParameter(pRequest, sizeWidthParam, -1);
int height = ServletUtil.getIntParameter(pRequest, sizeHeightParam, -1);
if (width > 0 || height > 0) {
pRequest.setAttribute(ImageServletResponse.ATTRIB_SIZE, new Dimension(width, height));
}
// Size uniform/percent
boolean uniform = ServletUtil.getBooleanParameter(pRequest, mSizeUniformParam, true);
boolean uniform = ServletUtil.getBooleanParameter(pRequest, sizeUniformParam, true);
if (!uniform) {
pRequest.setAttribute(ImageServletResponse.ATTRIB_SIZE_UNIFORM, Boolean.FALSE);
}
boolean percent = ServletUtil.getBooleanParameter(pRequest, mSizePercentParam, false);
boolean percent = ServletUtil.getBooleanParameter(pRequest, sizePercentParam, false);
if (percent) {
pRequest.setAttribute(ImageServletResponse.ATTRIB_SIZE_PERCENT, Boolean.TRUE);
}
// Area of interest parameters
int x = ServletUtil.getIntParameter(pRequest, mRegionLeftParam, -1); // Default is center
int y = ServletUtil.getIntParameter(pRequest, mRegionTopParam, -1); // Default is center
width = ServletUtil.getIntParameter(pRequest, mRegionWidthParam, -1);
height = ServletUtil.getIntParameter(pRequest, mRegionHeightParam, -1);
int x = ServletUtil.getIntParameter(pRequest, regionLeftParam, -1); // Default is center
int y = ServletUtil.getIntParameter(pRequest, regionTopParam, -1); // Default is center
width = ServletUtil.getIntParameter(pRequest, regionWidthParam, -1);
height = ServletUtil.getIntParameter(pRequest, regionHeightParam, -1);
if (width > 0 || height > 0) {
pRequest.setAttribute(ImageServletResponse.ATTRIB_AOI, new Rectangle(x, y, width, height));
}
// AOI uniform/percent
uniform = ServletUtil.getBooleanParameter(pRequest, mRegionUniformParam, false);
uniform = ServletUtil.getBooleanParameter(pRequest, regionUniformParam, false);
if (uniform) {
pRequest.setAttribute(ImageServletResponse.ATTRIB_SIZE_UNIFORM, Boolean.TRUE);
}
percent = ServletUtil.getBooleanParameter(pRequest, mRegionPercentParam, false);
percent = ServletUtil.getBooleanParameter(pRequest, regionPercentParam, false);
if (percent) {
pRequest.setAttribute(ImageServletResponse.ATTRIB_SIZE_PERCENT, Boolean.TRUE);
}

View File

@@ -144,7 +144,7 @@ import java.awt.geom.Rectangle2D;
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-servlet/src/main/java/com/twelvemonkeys/servlet/image/TextRenderer.java#2 $
* @version $Id: TextRenderer.java#2 $
*/
class TextRenderer /*extends ImageServlet implements ImagePainterServlet*/ {
@@ -342,7 +342,4 @@ class TextRenderer /*extends ImageServlet implements ImagePainterServlet*/ {
return angle;
}
}
}

View File

@@ -1,7 +1,6 @@
/**
* Contains various image-outputting servlets, that should run under any servlet engine. To create your own image servlet, simply subclass the servlet
* {@code ImageServlet}. Optionally implement the interface
* {@code ImagePainterServlet}, if you want to do painting.
* Contains various image-outputting filters, that should run under any
* servlet engine.
* <P>
* Some of these methods may require use of the native graphics libraries
* supported by the JVM, like the X libraries on Unix systems, and should be
@@ -13,8 +12,8 @@
* <A href="http://java.sun.com/j2se/1.4/docs/guide/awt/AWTChanges.html#headless">AWT Enhancements</A> and bugtraq report
* <A href="http://developer.java.sun.com/developer/bugParade/bugs/4281163.html">4281163</A> for more information on this issue.
* <P>
* If you cannot use JRE 1.4 for any reason, or do not want to use the X
* libraries, a possibilty is to use the
* If you cannot use JRE 1.4 or later, or do not want to use the X
* libraries, one possibility is to use the
* <A href="http://www.eteks.com/pja/en/">PJA package</A> (com.eteks.pja),
* and start the JVM with the following options:
* <DL>