diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/AbstractServletMapAdapter.java b/servlet/src/main/java/com/twelvemonkeys/servlet/AbstractServletMapAdapter.java index bbf1bf8b..700b0304 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/AbstractServletMapAdapter.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/AbstractServletMapAdapter.java @@ -9,7 +9,7 @@ import java.util.*; * * @author Harald Kuhr * @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> { // TODO: This map is now a little too lazy.. Should cache entries too (instead?) ! diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/BrowserHelperFilter.java b/servlet/src/main/java/com/twelvemonkeys/servlet/BrowserHelperFilter.java index 5558ed77..5335ac7e 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/BrowserHelperFilter.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/BrowserHelperFilter.java @@ -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 Harald Kuhr - * @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 instead private Pattern[] knownAgentPatterns; private String[] knownAgentAccepts; @@ -68,45 +69,52 @@ public class BrowserHelperFilter extends GenericFilter { // .accept= Properties mappings = new Properties(); + try { log("Reading Accept-mappings properties file: " + pPropertiesFile); mappings.load(getServletContext().getResourceAsStream(pPropertiesFile)); - List patterns = new ArrayList(); - List accepts = new ArrayList(); - //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 patterns = new ArrayList(); + List accepts = new ArrayList(); + + 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; } } diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/DebugServlet.java b/servlet/src/main/java/com/twelvemonkeys/servlet/DebugServlet.java index 01764406..894dbf6c 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/DebugServlet.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/DebugServlet.java @@ -42,7 +42,7 @@ import java.util.Enumeration; * * @author Harald Kuhr * @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; diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/GenericFilter.java b/servlet/src/main/java/com/twelvemonkeys/servlet/GenericFilter.java index 1d292e1a..2c279c85 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/GenericFilter.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/GenericFilter.java @@ -61,7 +61,7 @@ import java.util.Enumeration; * @author Harald Kuhr * @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 diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/GenericServlet.java b/servlet/src/main/java/com/twelvemonkeys/servlet/GenericServlet.java index e737ac77..0653e115 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/GenericServlet.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/GenericServlet.java @@ -47,7 +47,7 @@ import java.lang.reflect.InvocationTargetException; * @author Harald Kuhr * @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 { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/HttpServlet.java b/servlet/src/main/java/com/twelvemonkeys/servlet/HttpServlet.java index 2b546317..ea5d0754 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/HttpServlet.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/HttpServlet.java @@ -41,13 +41,13 @@ import java.lang.reflect.InvocationTargetException; * the method matching the signature {@code void setX(<Type>)}, * 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 Harald Kuhr * @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 { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/InitParam.java b/servlet/src/main/java/com/twelvemonkeys/servlet/InitParam.java index bf73ce93..51e160c7 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/InitParam.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/InitParam.java @@ -36,7 +36,7 @@ import java.lang.annotation.*; * * @author Harald Kuhr * @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) diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/OutputStreamAdapter.java b/servlet/src/main/java/com/twelvemonkeys/servlet/OutputStreamAdapter.java index 3e16defd..d3316f08 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/OutputStreamAdapter.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/OutputStreamAdapter.java @@ -63,7 +63,7 @@ import java.io.OutputStream; * * @author Harald Kuhr * @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 { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/ProxyServlet.java b/servlet/src/main/java/com/twelvemonkeys/servlet/ProxyServlet.java index 91ef9538..ae16403f 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/ProxyServlet.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/ProxyServlet.java @@ -66,7 +66,7 @@ import java.util.Enumeration; * @author Harald Kuhr * @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 { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/ServletConfigException.java b/servlet/src/main/java/com/twelvemonkeys/servlet/ServletConfigException.java index 66e8c33e..4d0b6389 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/ServletConfigException.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/ServletConfigException.java @@ -34,10 +34,12 @@ import javax.servlet.ServletException; * ServletConfigException. * * @author Harald Kuhr - * @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); } diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/ServletConfigMapAdapter.java b/servlet/src/main/java/com/twelvemonkeys/servlet/ServletConfigMapAdapter.java index 89aeeca9..1d23226a 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/ServletConfigMapAdapter.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/ServletConfigMapAdapter.java @@ -45,7 +45,7 @@ import java.util.*; *

* * @author Harald Kuhr - * @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 implements Map, Serializable, Cloneable { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/ServletHeadersMapAdapter.java b/servlet/src/main/java/com/twelvemonkeys/servlet/ServletHeadersMapAdapter.java index 52d7370c..76054e11 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/ServletHeadersMapAdapter.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/ServletHeadersMapAdapter.java @@ -12,7 +12,7 @@ import java.util.Iterator; * * @author Harald Kuhr * @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 { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/ServletParametersMapAdapter.java b/servlet/src/main/java/com/twelvemonkeys/servlet/ServletParametersMapAdapter.java index 4f95e524..01dca170 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/ServletParametersMapAdapter.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/ServletParametersMapAdapter.java @@ -12,7 +12,7 @@ import java.util.Iterator; * * @author Harald Kuhr * @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 { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/ServletResponseStreamDelegate.java b/servlet/src/main/java/com/twelvemonkeys/servlet/ServletResponseStreamDelegate.java index 3f9b89f5..3032010a 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/ServletResponseStreamDelegate.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/ServletResponseStreamDelegate.java @@ -42,7 +42,7 @@ import java.io.OutputStream; * * @author Harald Kuhr * @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; diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/ServletUtil.java b/servlet/src/main/java/com/twelvemonkeys/servlet/ServletUtil.java index f4acb24e..16772271 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/ServletUtil.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/ServletUtil.java @@ -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 { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/ThrottleFilter.java b/servlet/src/main/java/com/twelvemonkeys/servlet/ThrottleFilter.java index 67adb0ff..99d073b1 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/ThrottleFilter.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/ThrottleFilter.java @@ -46,19 +46,16 @@ import java.util.Map; /** * ThrottleFilter, a filter for easing server during heavy load. - * - * Intercepts requests, and returns HTTP response code 503 - * (Service Unavailable), if there are more than a given number of concurrent + *

+ * 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 Harald Kuhr * @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 true if the request should be handled. + * @return {@code true} if the request should be handled. */ private boolean beginRequest() { synchronized (runningThreadsLock) { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/TimingFilter.java b/servlet/src/main/java/com/twelvemonkeys/servlet/TimingFilter.java index 30277ae3..23a79a5e 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/TimingFilter.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/TimingFilter.java @@ -40,7 +40,7 @@ import java.io.IOException; * * @author Harald Kuhr * @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; diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/TrimWhiteSpaceFilter.java b/servlet/src/main/java/com/twelvemonkeys/servlet/TrimWhiteSpaceFilter.java index fcc82cfd..9005136e 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/TrimWhiteSpaceFilter.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/TrimWhiteSpaceFilter.java @@ -109,7 +109,7 @@ import java.io.FilterOutputStream; * * @author Harald Kuhr * @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 { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/AbstractCacheRequest.java b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/AbstractCacheRequest.java index 0ed17896..523c2f2d 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/AbstractCacheRequest.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/AbstractCacheRequest.java @@ -9,7 +9,7 @@ import java.net.URI; * * @author Harald Kuhr * @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; diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/AbstractCacheResponse.java b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/AbstractCacheResponse.java index f09c9ce6..98d10356 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/AbstractCacheResponse.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/AbstractCacheResponse.java @@ -7,7 +7,7 @@ import java.util.*; * * @author Harald Kuhr * @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 values = pAdd ? headers.get(pHeaderName) : null; + if (values == null) { values = new ArrayList(); headers.put(pHeaderName, values); } + values.add(pHeaderValue); } diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheException.java b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheException.java index fb9be851..bc7ca17c 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheException.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheException.java @@ -5,7 +5,7 @@ package com.twelvemonkeys.servlet.cache; * * @author Harald Kuhr * @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) { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheFilter.java b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheFilter.java index 573d48a1..1996060f 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheFilter.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheFilter.java @@ -52,7 +52,7 @@ import java.util.logging.Logger; * @author Jayson Falkner * @author Harald Kuhr * @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 { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheRequest.java b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheRequest.java index 93ddde33..486dca11 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheRequest.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheRequest.java @@ -9,7 +9,7 @@ import java.util.Map; * * @author Harald Kuhr * @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(); diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheResponse.java b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheResponse.java index 94328669..2e94b4c8 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheResponse.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheResponse.java @@ -10,7 +10,7 @@ import java.util.Map; * * @author Harald Kuhr * @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; diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheResponseWrapper.java b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheResponseWrapper.java index f94d9ac2..ee567d8e 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheResponseWrapper.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CacheResponseWrapper.java @@ -49,7 +49,7 @@ import java.io.PrintWriter; * @author Jayson Falkner * @author Harald Kuhr * @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)); diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CachedEntity.java b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CachedEntity.java index 7e29bdc2..e82e5d82 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CachedEntity.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CachedEntity.java @@ -34,7 +34,7 @@ import java.io.IOException; * CachedEntity * * @author Harald Kuhr - * @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 { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CachedEntityImpl.java b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CachedEntityImpl.java index 6626a8ac..f612bca5 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CachedEntityImpl.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CachedEntityImpl.java @@ -38,7 +38,7 @@ import java.util.List; * CachedEntity * * @author Harald Kuhr - * @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, diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CachedResponse.java b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CachedResponse.java index 14ba1626..4696f284 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CachedResponse.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CachedResponse.java @@ -35,7 +35,7 @@ import java.io.OutputStream; * CachedResponse * * @author Harald Kuhr - * @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 { /** diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CachedResponseImpl.java b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CachedResponseImpl.java index eb955d01..4fd870aa 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CachedResponseImpl.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/CachedResponseImpl.java @@ -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 Harald Kuhr - * @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> 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> pHeaders, final int pHeaderSize, final byte[] pContent) { + CachedResponseImpl(final int pStatus, final LinkedHashMap> 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 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 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()]); } /** diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ClientCacheRequest.java b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ClientCacheRequest.java index 2d0f4816..80b02f00 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ClientCacheRequest.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ClientCacheRequest.java @@ -10,7 +10,7 @@ import java.util.Map; * * @author Harald Kuhr * @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> parameters; diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ClientCacheResponse.java b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ClientCacheResponse.java index 36e71345..795e3180 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ClientCacheResponse.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ClientCacheResponse.java @@ -9,7 +9,7 @@ import java.io.OutputStream; * * @author Harald Kuhr * @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... diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/HTTPCache.java b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/HTTPCache.java index 402a2664..16ac0894 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/HTTPCache.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/HTTPCache.java @@ -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; *

* * @author Harald Kuhr - * @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> headerMap = new LinkedMap>(); + LinkedHashMap> headerMap = new LinkedHashMap>(); 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); } } diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ResponseResolver.java b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ResponseResolver.java index a92a6801..6e513928 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ResponseResolver.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ResponseResolver.java @@ -7,7 +7,7 @@ import java.io.IOException; * * @author Harald Kuhr * @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; diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/SerlvetCacheResponseWrapper.java b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/SerlvetCacheResponseWrapper.java index 5bc5c2bb..e88123f4 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/SerlvetCacheResponseWrapper.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/SerlvetCacheResponseWrapper.java @@ -52,14 +52,14 @@ import java.util.Map; * @author Jayson Falkner * @author Harald Kuhr * @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)); diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ServletCacheRequest.java b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ServletCacheRequest.java index d3b5b66d..1f88a02f 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ServletCacheRequest.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ServletCacheRequest.java @@ -12,7 +12,7 @@ import java.util.Map; * * @author Harald Kuhr * @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; diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ServletCacheResponse.java b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ServletCacheResponse.java index 7ffebc95..855f6655 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ServletCacheResponse.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ServletCacheResponse.java @@ -9,38 +9,38 @@ import java.io.OutputStream; * * @author Harald Kuhr * @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; } } diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ServletResponseResolver.java b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ServletResponseResolver.java index 352a9b06..314dd69a 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ServletResponseResolver.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/ServletResponseResolver.java @@ -10,7 +10,7 @@ import java.io.IOException; * * @author Harald Kuhr * @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; diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/WritableCachedResponse.java b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/WritableCachedResponse.java index c6ce7e6a..ded04f68 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/WritableCachedResponse.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/WritableCachedResponse.java @@ -34,7 +34,7 @@ import java.io.OutputStream; * WritableCachedResponse * * @author Harald Kuhr - * @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 { /** diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/WritableCachedResponseImpl.java b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/WritableCachedResponseImpl.java index 8c9299d1..fd39747c 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/cache/WritableCachedResponseImpl.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/cache/WritableCachedResponseImpl.java @@ -42,7 +42,7 @@ import java.util.Map; * WritableCachedResponseImpl * * @author Harald Kuhr - * @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 values = null; - if (pAdd) { - values = cachedResponse.headers.get(pName); - } + List values = pAdd ? cachedResponse.headers.get(pName) : null; if (values == null) { values = new ArrayList(); @@ -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(); diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/FileSizeExceededException.java b/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/FileSizeExceededException.java index c55090cc..ca5642ab 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/FileSizeExceededException.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/FileSizeExceededException.java @@ -33,7 +33,7 @@ package com.twelvemonkeys.servlet.fileupload; *

* * @author Harald Kuhr - * @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) { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/FileUploadException.java b/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/FileUploadException.java index fd8175e8..57dc89e3 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/FileUploadException.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/FileUploadException.java @@ -35,7 +35,7 @@ import javax.servlet.ServletException; *

* * @author Harald Kuhr - * @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) { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/FileUploadFilter.java b/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/FileUploadFilter.java index 316e3862..a891ac63 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/FileUploadFilter.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/FileUploadFilter.java @@ -51,7 +51,7 @@ import java.net.MalformedURLException; * @see HttpFileUploadRequest * * @author Harald Kuhr - * @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; diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/HttpFileUploadRequest.java b/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/HttpFileUploadRequest.java index 92a3e990..32d58cbd 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/HttpFileUploadRequest.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/HttpFileUploadRequest.java @@ -35,7 +35,7 @@ import javax.servlet.http.HttpServletRequest; * Form-based File Upload in HTML (RFC1867). * * @author Harald Kuhr - * @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 { /** diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/HttpFileUploadRequestWrapper.java b/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/HttpFileUploadRequestWrapper.java index c3ed82b4..60080507 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/HttpFileUploadRequestWrapper.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/HttpFileUploadRequestWrapper.java @@ -43,7 +43,7 @@ import java.util.*; * Jakarta Commons FileUpload. * * @author Harald Kuhr - * @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 { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/UploadedFile.java b/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/UploadedFile.java index f4c1e6df..508f12f2 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/UploadedFile.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/UploadedFile.java @@ -36,7 +36,7 @@ import java.io.IOException; * This class represents an uploaded file. * * @author Harald Kuhr - * @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 { /** diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/UploadedFileImpl.java b/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/UploadedFileImpl.java index 194c90a2..e2d66267 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/UploadedFileImpl.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/fileupload/UploadedFileImpl.java @@ -40,7 +40,7 @@ import java.io.File; * Jakarta Commons FileUpload. * * @author Harald Kuhr - * @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; diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/gzip/GZIPFilter.java b/servlet/src/main/java/com/twelvemonkeys/servlet/gzip/GZIPFilter.java index f40a92df..f30d9c6a 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/gzip/GZIPFilter.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/gzip/GZIPFilter.java @@ -104,7 +104,7 @@ import java.io.IOException; * @author Jayson Falkner * @author Harald Kuhr * @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); } } diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/gzip/GZIPResponseWrapper.java b/servlet/src/main/java/com/twelvemonkeys/servlet/gzip/GZIPResponseWrapper.java index 7d1c4669..b6e4fd55 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/gzip/GZIPResponseWrapper.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/gzip/GZIPResponseWrapper.java @@ -48,7 +48,7 @@ import java.util.zip.GZIPOutputStream; * @author Jayson Falkner * @author Harald Kuhr * @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) { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/image/AWTImageFilterAdapter.java b/servlet/src/main/java/com/twelvemonkeys/servlet/image/AWTImageFilterAdapter.java index 39388de5..11d231c1 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/image/AWTImageFilterAdapter.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/image/AWTImageFilterAdapter.java @@ -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 Harald Kuhr + * @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... } } diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/image/BufferedImageOpAdapter.java b/servlet/src/main/java/com/twelvemonkeys/servlet/image/BufferedImageOpAdapter.java index 33e25256..cc0b52f9 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/image/BufferedImageOpAdapter.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/image/BufferedImageOpAdapter.java @@ -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 Harald Kuhr + * @version $Id: BufferedImageOpAdapter.java#1 $ * */ public class BufferedImageOpAdapter extends ImageFilter { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/image/ColorServlet.java b/servlet/src/main/java/com/twelvemonkeys/servlet/image/ColorServlet.java index f0b5081a..47ae42dd 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/image/ColorServlet.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/image/ColorServlet.java @@ -47,7 +47,7 @@ import java.util.zip.CRC32; * * @author Harald Kuhr * @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"; diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/image/ComposeFilter.java b/servlet/src/main/java/com/twelvemonkeys/servlet/image/ComposeFilter.java index 0952c366..7fa3f02c 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/image/ComposeFilter.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/image/ComposeFilter.java @@ -38,7 +38,7 @@ import java.io.IOException; *

* * @author Harald Kuhr - * @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 { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/image/ContentNegotiationFilter.java b/servlet/src/main/java/com/twelvemonkeys/servlet/image/ContentNegotiationFilter.java index 68fb125c..b0d33327 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/image/ContentNegotiationFilter.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/image/ContentNegotiationFilter.java @@ -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 Harald Kuhr + * @version $Id: ContentNegotiationFilter.java#1 $ */ public class ContentNegotiationFilter extends ImageFilter { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/image/CropFilter.java b/servlet/src/main/java/com/twelvemonkeys/servlet/image/CropFilter.java index e3a7bdbf..d761c5c4 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/image/CropFilter.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/image/CropFilter.java @@ -91,7 +91,7 @@ import java.awt.image.RenderedImage; * * @author Harald Kuhr * @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}*/ diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageFilter.java b/servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageFilter.java index a4615ad7..68970fb4 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageFilter.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageFilter.java @@ -45,7 +45,7 @@ import java.io.IOException; * @see #doFilter(java.awt.image.BufferedImage,javax.servlet.ServletRequest,ImageServletResponse) * * @author Harald Kuhr - * @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 { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletException.java b/servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletException.java index 6e4de253..93143ffb 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletException.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletException.java @@ -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 Harald Kuhr * @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 { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletResponse.java b/servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletResponse.java index 772bd548..25fdf89e 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletResponse.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletResponse.java @@ -41,7 +41,7 @@ import java.awt.image.BufferedImage; * {@link #getImage()} to have any effect. * * @author Harald Kuhr - * @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 { /** diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletResponseImpl.java b/servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletResponseImpl.java index 9f79f4a7..afa50257 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletResponseImpl.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/image/ImageServletResponseImpl.java @@ -65,7 +65,7 @@ import java.util.Iterator; *

* * @author Harald Kuhr - * @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); diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/image/NullImageFilter.java b/servlet/src/main/java/com/twelvemonkeys/servlet/image/NullImageFilter.java index aa6e570d..107a1a3f 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/image/NullImageFilter.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/image/NullImageFilter.java @@ -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 Harald Kuhr + * @version $Id: NullImageFilter.java $ * */ public final class NullImageFilter extends ImageFilter { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/image/RotateFilter.java b/servlet/src/main/java/com/twelvemonkeys/servlet/image/RotateFilter.java index 49cfc89b..a4dfce38 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/image/RotateFilter.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/image/RotateFilter.java @@ -78,7 +78,7 @@ import java.awt.image.RenderedImage; * * @author Harald Kuhr * @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 { diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/image/ScaleFilter.java b/servlet/src/main/java/com/twelvemonkeys/servlet/image/ScaleFilter.java index 583ab494..0451cd34 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/image/ScaleFilter.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/image/ScaleFilter.java @@ -69,7 +69,7 @@ import java.lang.reflect.Field; * * @author Harald Kuhr * @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 <IMG src="/scale/test.jpg?scaleX=500&scaleUniform=false"> * @example <IMG src="/scale/test.png?scaleY=50&scaleUnits=PERCENT"> diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/image/SourceRenderFilter.java b/servlet/src/main/java/com/twelvemonkeys/servlet/image/SourceRenderFilter.java index bc518d68..b93f9826 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/image/SourceRenderFilter.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/image/SourceRenderFilter.java @@ -21,69 +21,69 @@ import java.io.IOException; * @see ImageServletResponse#ATTRIB_AOI * * @author Harald Kuhr - * @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); } diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/image/TextRenderer.java b/servlet/src/main/java/com/twelvemonkeys/servlet/image/TextRenderer.java index b4380bf3..521eb171 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/image/TextRenderer.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/image/TextRenderer.java @@ -144,7 +144,7 @@ import java.awt.geom.Rectangle2D; * * @author Harald Kuhr * @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; } - -} - - +} \ No newline at end of file diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/image/package_info.java b/servlet/src/main/java/com/twelvemonkeys/servlet/image/package_info.java index 006395c7..d18e9deb 100755 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/image/package_info.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/image/package_info.java @@ -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. *

* 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 @@ * AWT Enhancements and bugtraq report * 4281163 for more information on this issue. *

- * 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 * PJA package (com.eteks.pja), * and start the JVM with the following options: *