Author: vgritsenko
Date: Wed Feb 23 14:48:09 2005
New Revision: 155099
URL: http://svn.apache.org/viewcvs?view=rev&rev=155099
Log:
Move response header initialization into the setup phase.
Remove Last-Modified header initialization: this is done in
the environment by request from AbstractProcessingPipeline.
Modified:
cocoon/trunk/src/java/org/apache/cocoon/reading/ImageReader.java
cocoon/trunk/src/java/org/apache/cocoon/reading/ResourceReader.java
Modified: cocoon/trunk/src/java/org/apache/cocoon/reading/ImageReader.java
URL:
http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/reading/ImageReader.java?view=diff&r1=155098&r2=155099
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/reading/ImageReader.java (original)
+++ cocoon/trunk/src/java/org/apache/cocoon/reading/ImageReader.java Wed Feb 23
14:48:09 2005
@@ -1,12 +1,12 @@
/*
* Copyright 1999-2004 The Apache Software Foundation.
- *
+ *
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -61,13 +61,13 @@
* of the image is kept.
* </dd>
* <dt><scale(Red|Green|Blue)></dt>
- * <dd>This parameter is optional. When specified it will cause the
- * specified color component in the image to be multiplied by the
+ * <dd>This parameter is optional. When specified it will cause the
+ * specified color component in the image to be multiplied by the
* specified floating point value.
* </dd>
* <dt><offset(Red|Green|Blue)></dt>
- * <dd>This parameter is optional. When specified it will cause the
- * specified color component in the image to be incremented by the
+ * <dd>This parameter is optional. When specified it will cause the
+ * specified color component in the image to be incremented by the
* specified floating point value.
* </dd>
* <dt><grayscale></dt>
@@ -90,27 +90,23 @@
* @version CVS $Id$
*/
final public class ImageReader extends ResourceReader {
+ private static final boolean GRAYSCALE_DEFAULT = false;
+ private static final boolean ENLARGE_DEFAULT = true;
+ private static final boolean FIT_DEFAULT = false;
private int width;
private int height;
-
private float[] scaleColor = new float[3];
private float[] offsetColor = new float[3];
- private RescaleOp colorFilter = null;
private boolean enlarge;
- private final static String ENLARGE_DEFAULT = "true";
-
private boolean fitUniform;
- private final static String FIT_DEFAULT = "false";
+ private RescaleOp colorFilter;
+ private ColorConvertOp grayscaleFilter;
- private ColorConvertOp grayscaleFilter = null;
- private final static String GRAYSCALE_DEFAULT = "false";
public void setup(SourceResolver resolver, Map objectModel, String src,
Parameters par)
- throws ProcessingException, SAXException, IOException {
-
- super.setup(resolver, objectModel, src, par);
+ throws ProcessingException, SAXException, IOException {
width = par.getParameterAsInteger("width", 0);
height = par.getParameterAsInteger("height", 0);
@@ -123,7 +119,6 @@
offsetColor[2] = par.getParameterAsFloat("offsetBlue", 0.0f);
boolean filterColor = false;
-
for (int i = 0; i < 3; ++i) {
if (scaleColor[i] != -1.0f) {
filterColor = true;
@@ -136,26 +131,36 @@
}
if (filterColor) {
- colorFilter = new RescaleOp(scaleColor, offsetColor, null);
- } else {
- colorFilter = null;
+ this.colorFilter = new RescaleOp(scaleColor, offsetColor, null);
}
- String grayscalePar = par.getParameter("grayscale", GRAYSCALE_DEFAULT);
- if (BooleanUtils.toBoolean(grayscalePar)){
- grayscaleFilter = new
ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
- } else {
- grayscaleFilter = null;
- }
+ if (par.getParameterAsBoolean("grayscale", GRAYSCALE_DEFAULT)) {
+ this.grayscaleFilter = new
ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
+ }
- String enlargePar = par.getParameter("allow-enlarging",
ENLARGE_DEFAULT);
- enlarge = BooleanUtils.toBoolean(enlargePar);
+ this.enlarge = par.getParameterAsBoolean("allow-enlarging",
ENLARGE_DEFAULT);
+ this.fitUniform = par.getParameterAsBoolean("fit-uniform",
FIT_DEFAULT);
- String fitUniformPar = par.getParameter("fit-uniform", FIT_DEFAULT);
- fitUniform = BooleanUtils.toBoolean(fitUniformPar);
+ super.setup(resolver, objectModel, src, par);
+ }
+
+ protected void setupHeaders() {
+ // Reset byte ranges support for dynamic response
+ if (byteRanges && hasTransform()) {
+ byteRanges = false;
+ }
+
+ super.setupHeaders();
}
- /**
+ /**
+ * @return True if image transform is specified
+ */
+ private boolean hasTransform() {
+ return width > 0 || height > 0 || null != colorFilter || null !=
grayscaleFilter;
+ }
+
+ /**
* Returns the affine transform that implements the scaling.
* The behavior is the following: if both the new width and height values
* are positive, the image is rescaled according to these new values and
@@ -211,16 +216,13 @@
}
protected void processStream(InputStream inputStream) throws IOException,
ProcessingException {
- if (width > 0 || height > 0 || null != colorFilter || null !=
grayscaleFilter) {
+ if (hasTransform()) {
if (getLogger().isDebugEnabled()) {
getLogger().debug("image " + ((width == 0) ? "?" :
Integer.toString(width))
+ "x" + ((height == 0) ? "?" :
Integer.toString(height))
+ " expires: " + expires);
}
- // since we create the image on the fly
- response.setHeader("Accept-Ranges", "none");
-
/*
* NOTE (SM):
* Due to Bug Id 4502892 (which is found in *all* JVM
implementations from
@@ -270,15 +272,9 @@
}
if (!handleJVMBug()) {
- if (getLogger().isDebugEnabled()) {
- getLogger().debug( "No need to handle JVM bug" );
- }
JPEGImageEncoder encoder =
JPEGCodec.createJPEGEncoder(out);
encoder.encode(currentImage);
} else {
- if (getLogger().isDebugEnabled()) {
- getLogger().debug( "Need to handle JVM bug" );
- }
ByteArrayOutputStream bstream = new
ByteArrayOutputStream();
JPEGImageEncoder encoder =
JPEGCodec.createJPEGEncoder(bstream);
encoder.encode(currentImage);
@@ -287,7 +283,8 @@
out.flush();
} catch (ImageFormatException e) {
- throw new ProcessingException("Error reading the image. Note
that only JPEG images are currently supported.");
+ throw new ProcessingException("Error reading the image. " +
+ "Note that only JPEG images are
currently supported.");
} finally {
// Bugzilla Bug 25069, close inputStream in finally block
// this will close inputStream even if processStream throws
@@ -311,8 +308,8 @@
* parameters
*/
public Serializable getKey() {
- return this.inputSource.getURI()
- + ':' + this.width
+ return this.inputSource.getURI()
+ + ':' + this.width
+ ':' + this.height
+ ":" + this.scaleColor[0]
+ ":" + this.scaleColor[1]
@@ -326,7 +323,7 @@
/**
* Determine if workaround for Bug Id 4502892 is neccessary.
- * This method assumes that Bug is present if
+ * This method assumes that Bug is present if
* java.version is undeterminable, and for java.version
* 1.1, 1.2, 1.3, all other java.version do not need the Bug handling
*
@@ -351,8 +348,8 @@
handleJVMBug = true;
}
if (getLogger().isDebugEnabled()) {
- getLogger().debug( "Running java.version " +
String.valueOf(java_version) +
- " need to handle JVM bug " + String.valueOf(handleJVMBug) );
+ getLogger().debug("Running java " + String.valueOf(java_version) +
+ " need to handle JVM bug " +
String.valueOf(handleJVMBug));
}
return handleJVMBug;
Modified: cocoon/trunk/src/java/org/apache/cocoon/reading/ResourceReader.java
URL:
http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/reading/ResourceReader.java?view=diff&r1=155098&r2=155099
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/reading/ResourceReader.java
(original)
+++ cocoon/trunk/src/java/org/apache/cocoon/reading/ResourceReader.java Wed Feb
23 14:48:09 2005
@@ -153,6 +153,27 @@
} catch (SourceException e) {
throw SourceUtil.handle("Error during resolving of '" + src +
"'.", e);
}
+
+ setupHeaders();
+ }
+
+ /**
+ * Setup the response headers: Accept-Ranges, Expires.
+ */
+ protected void setupHeaders() {
+ // Tell the client whether we support byte range requests or not
+ if (byteRanges) {
+ response.setHeader("Accept-Ranges", "bytes");
+ } else {
+ response.setHeader("Accept-Ranges", "none");
+ }
+
+ if (expires > 0) {
+ response.setDateHeader("Expires", System.currentTimeMillis() +
expires);
+ } else if (expires == 0) {
+ // See Bug #14048
+ response.addHeader("Vary", "Host");
+ }
}
/**
@@ -169,6 +190,13 @@
}
/**
+ * @return True if byte ranges support is enabled and request has range
header.
+ */
+ protected boolean hasRanges() {
+ return this.byteRanges && this.request.getHeader("Range") != null;
+ }
+
+ /**
* Generate the unique key.
* This key must be unique inside the space of this component.
*
@@ -185,7 +213,7 @@
* component is currently not cacheable.
*/
public SourceValidity getValidity() {
- if (request.getHeader("Range") != null) {
+ if (hasRanges()) {
// This is a byte range request so we can't use the cache, return
null.
return null;
} else {
@@ -198,7 +226,7 @@
* possible to detect
*/
public long getLastModified() {
- if(request.getHeader("Range") != null) {
+ if (hasRanges()) {
// This is a byte range request so we can't use the cache, return
null.
return 0;
}
@@ -221,13 +249,6 @@
byte[] buffer = new byte[bufferSize];
int length = -1;
- // tell the client whether we support byte range requests or not
- if(byteRanges) {
- response.setHeader("Accept-Ranges", "bytes");
- } else {
- response.setHeader("Accept-Ranges", "none");
- }
-
String ranges = request.getHeader("Range");
ByteRange byteRange;
@@ -265,7 +286,6 @@
}
response.setHeader("Content-Range", entityRange + "/" +
entityLength);
-
if (response instanceof HttpResponse) {
// Response with status 206 (Partial content)
((HttpResponse)response).setStatus(206);
@@ -300,18 +320,6 @@
public void generate()
throws IOException, ProcessingException {
try {
- if (expires > 0) {
- response.setDateHeader("Expires", System.currentTimeMillis() +
expires);
- } else if (expires == 0) {
- // See Bug #14048
- response.addHeader("Vary", "Host");
- }
-
- long lastModified = getLastModified();
- if (lastModified > 0) {
- response.setDateHeader("Last-Modified", lastModified);
- }
-
InputStream inputStream;
try {
inputStream = inputSource.getInputStream();
@@ -319,9 +327,7 @@
throw SourceUtil.handle("Error during resolving of the input
stream", e);
}
- // Bugzilla Bug #25069, close inputStream in finally block.
- // This will close inputStream even if processStream throws
- // an exception
+ // Bugzilla Bug #25069: Close inputStream in finally block.
try {
processStream(inputStream);
} finally {