Skip to content

Commit 83ce080

Browse files
Handle 204 no content for SingleImageLayer
1 parent cc6d51d commit 83ce080

2 files changed

Lines changed: 56 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.getRawStatusCode() == HttpStatus.NO_CONTENT.value()) {
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: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
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;
89
import org.junit.jupiter.api.Assertions;
@@ -36,6 +37,34 @@ public void testFetchImage() throws IOException {
3637
}
3738
}
3839

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

4170
public AbstractSingleImageLayerTestImpl(AbstractLayerParams layerParams) {

0 commit comments

Comments
 (0)