package org.geowebcache.util; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.channels.Channels; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.imageio.ImageIO; import org.geowebcache.GeoWebCacheException; import org.geowebcache.conveyor.ConveyorTile; import org.geowebcache.grid.GridSubset; import org.geowebcache.io.Resource; import org.geowebcache.layer.TileResponseReceiver; import org.geowebcache.layer.wms.WMSLayer; import org.geowebcache.layer.wms.WMSMetaTile; import org.geowebcache.layer.wms.WMSSourceHelper; import org.geowebcache.mime.MimeType; public class MockWMSSourceHelper extends WMSSourceHelper { private Font font = Font.decode("Arial-BOLD-14"); private Map<List<Integer>, byte[]> images = new HashMap<List<Integer>, byte[]>(); @Override protected void makeRequest(TileResponseReceiver tileRespRecv, WMSLayer layer, Map<String, String> wmsParams, MimeType expectedMimeType, Resource target) throws GeoWebCacheException { long ts = System.currentTimeMillis(); long[][] tiles; int tileW; int tileH; String format; if (tileRespRecv instanceof ConveyorTile) { ConveyorTile conveyorTile = (ConveyorTile) tileRespRecv; long[] tileIndex = conveyorTile.getTileIndex(); tiles = new long[1][1]; tiles[0] = tileIndex; format = conveyorTile.getMimeType().getInternalName().toUpperCase(); tileW = conveyorTile.getGridSubset().getTileWidth(); tileH = conveyorTile.getGridSubset().getTileHeight(); } else { WMSMetaTile metaTile = (WMSMetaTile) tileRespRecv; tiles = metaTile.getTilesGridPositions(); format = metaTile.getResponseFormat().getInternalName().toUpperCase(); GridSubset gridSubset = layer.getGridSubset(layer.getGridSubsets().iterator().next()); tileW = gridSubset.getTileWidth(); tileH = gridSubset.getTileHeight(); } int width = Integer.parseInt(wmsParams.get("WIDTH")); int height = Integer.parseInt(wmsParams.get("HEIGHT")); int tilesX = width / tileW; int tilesY = height / tileH; List<Integer> wh = Arrays.asList(width, height); byte[] result = images.get(wh); if (result == null) { synchronized (images) { if ((result = images.get(wh)) == null) { BufferedImage img; img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D graphics = img.createGraphics(); graphics.setColor(Color.LIGHT_GRAY); graphics.fillRect(0, 0, width, height); // graphics.setColor(Color.BLACK); // graphics.setFont(font); int tileN = 0; for (int y = 0; y < tilesY; y++) { for (int x = 0; x < tilesX; x++) { long[] t = tiles[tileN]; tileN++; int gx = x * tileW; int gy = y * tileH; // gx += 15; // gy += tileH / 2; // graphics.drawString(Arrays.toString(t), gx, gy); graphics.setColor(Color.RED); graphics.setStroke(new BasicStroke(2)); graphics.drawRect(gx + 1, gy + 1, tileW - 2, tileH - 2); } } graphics.dispose(); ByteArrayOutputStream output = new ByteArrayOutputStream(); try { ImageIO.write(img, format, output); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } result = output.toByteArray(); images.put(wh, result); } } } try { target.transferFrom(Channels.newChannel(new ByteArrayInputStream(result))); } catch (IOException e) { throw new RuntimeException(e); } // ts = System.currentTimeMillis() - ts; // System.err.println(tiles.length + " tiles generated in " + ts + "ms"); } }