Skip to content

Commit 3602e46

Browse files
authored
Merge pull request #3882 from sogelink/204-no-content
Handle 204 no content for SingleImageLayer
2 parents cc6d51d + 8cb72df commit 3602e46

2 files changed

Lines changed: 57 additions & 0 deletions

File tree

core/src/main/java/org/mapfish/print/map/image/AbstractSingleImageLayer.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.codahale.metrics.MetricRegistry;
66
import com.codahale.metrics.Timer;
77
import jakarta.annotation.Nonnull;
8+
import java.awt.Color;
89
import java.awt.Graphics2D;
910
import java.awt.Rectangle;
1011
import java.awt.image.BufferedImage;
@@ -138,6 +139,24 @@ protected BufferedImage createErrorImage(final Rectangle area) {
138139
}
139140
}
140141

142+
/**
143+
* Create a transparent image.
144+
*
145+
* @param area The size of the image
146+
*/
147+
protected BufferedImage createTransparentImage(final Rectangle area) {
148+
final BufferedImage bufferedImage =
149+
new BufferedImage(area.width, area.height, TYPE_INT_ARGB_PRE);
150+
final Graphics2D graphics = bufferedImage.createGraphics();
151+
try {
152+
graphics.setBackground(new Color(0, 0, 0, 0));
153+
graphics.clearRect(0, 0, area.width, area.height);
154+
return bufferedImage;
155+
} finally {
156+
graphics.dispose();
157+
}
158+
}
159+
141160
/**
142161
* Fetch the given image from the web.
143162
*
@@ -152,6 +171,14 @@ protected BufferedImage fetchImage(
152171
try (Timer.Context ignored = this.registry.timer(baseMetricName).time()) {
153172
try (ClientHttpResponse httpResponse = request.execute()) {
154173
final List<String> contentType = httpResponse.getHeaders().get("Content-Type");
174+
175+
if (httpResponse.getStatusCode() == HttpStatus.NO_CONTENT) {
176+
LOGGER.info(
177+
"The request {} returns a no content status code, we consider it as an empty tile.",
178+
request.getURI());
179+
return createTransparentImage(transformer.getPaintArea());
180+
}
181+
155182
final String invalidRespBody = getInvalidResponseBody(request, contentType, httpResponse);
156183

157184
if (!isResponseStatusCodeValid(request, httpResponse, invalidRespBody, baseMetricName)) {

core/src/test/java/org/mapfish/print/map/image/AbstractSingleImageLayerTest.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
import static org.junit.jupiter.api.Assertions.assertTrue;
44

55
import com.codahale.metrics.MetricRegistry;
6+
import java.awt.Dimension;
67
import java.awt.image.BufferedImage;
78
import java.io.IOException;
9+
import org.junit.Assert;
810
import org.junit.jupiter.api.Assertions;
911
import org.junit.jupiter.api.Test;
1012
import org.mapfish.print.Constants;
@@ -36,6 +38,34 @@ public void testFetchImage() throws IOException {
3638
}
3739
}
3840

41+
@Test
42+
public void testFetch204NonContent() throws IOException {
43+
MapfishMapContext mapContext =
44+
new MapfishMapContext(null, new Dimension(10, 10), 100, 100, false, true);
45+
MockClientHttpRequest mockClientHttpRequest = new MockClientHttpRequest();
46+
final int noContentCode = 204;
47+
mockClientHttpRequest.setResponse(new MockClientHttpResponse(new byte[0], noContentCode));
48+
AbstractLayerParams layerParams = new AbstractLayerParams();
49+
layerParams.failOnError = true;
50+
AbstractSingleImageLayer layer = new AbstractSingleImageLayerTestImpl(layerParams);
51+
try {
52+
BufferedImage bufferedImage = layer.fetchImage(mockClientHttpRequest, mapContext);
53+
54+
Assert.assertEquals("Image width is not correct", 10, bufferedImage.getWidth());
55+
Assert.assertEquals("Image height is not correct", 10, bufferedImage.getHeight());
56+
57+
// check alpha chanel is equal to 0 for every pixels
58+
for (int x = 0; x < bufferedImage.getWidth(); x++) {
59+
for (int y = 0; y < bufferedImage.getHeight(); y++) {
60+
int argb = bufferedImage.getRGB(x, y);
61+
Assert.assertEquals("Pixel (" + x + "," + y + ") is not transparent", 0, (argb >>> 24));
62+
}
63+
}
64+
} catch (Exception e) {
65+
Assert.fail("Did throw exception " + e.getMessage());
66+
}
67+
}
68+
3969
private static class AbstractSingleImageLayerTestImpl extends AbstractSingleImageLayer {
4070

4171
public AbstractSingleImageLayerTestImpl(AbstractLayerParams layerParams) {

0 commit comments

Comments
 (0)