/* (c) 2016 Open Source Geospatial Foundation - all rights reserved
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.wms.map;
import java.awt.image.RenderedImage;
import java.io.IOException;
import java.io.OutputStream;
import org.geoserver.platform.Operation;
import org.geoserver.platform.ServiceException;
import org.geoserver.wms.MapProducerCapabilities;
import org.geoserver.wms.WMS;
import org.geoserver.wms.WMSMapContent;
/**
* Allows encoding in JPEG or PNG depending on whether the image has transparency, or not
*/
public class JpegPngMapResponse extends RenderedImageMapResponse {
public static final String MIME = "image/vnd.jpeg-png";
private static final String[] OUTPUT_FORMATS = { MIME };
private static MapProducerCapabilities CAPABILITIES = new MapProducerCapabilities(true, false,
false, true, null);
private PNGMapResponse pngResponse;
private JPEGMapResponse jpegResponse;
/**
* @param format the format name as to be reported in the capabilities document
* @param wms
*/
public JpegPngMapResponse(WMS wms, JPEGMapResponse jpegResponse, PNGMapResponse pngResponse) {
super(OUTPUT_FORMATS, wms);
this.jpegResponse = jpegResponse;
this.pngResponse = pngResponse;
}
@Override
public String getMimeType(Object value, Operation operation) throws ServiceException {
RenderedImageMap map = ((RenderedImageMap) value);
return JpegOrPngChooser.getFromMap(map).getMime();
}
@Override
public String getPreferredDisposition(Object value, Operation operation) {
RenderedImageMap map = ((RenderedImageMap) value);
String extension = JpegOrPngChooser.getFromMap(map).getMime();
return map.getSimpleAttachmentFileName() + "." + extension;
}
/**
* Transforms the rendered image into the appropriate format, streaming to the output stream.
*
* @see RasterMapOutputFormat#formatImageOutputStream(RenderedImage, OutputStream)
*/
@Override
public void formatImageOutputStream(RenderedImage image, OutputStream outStream,
WMSMapContent mapContent) throws ServiceException, IOException {
JpegOrPngChooser chooser = JpegOrPngChooser.getFromMapContent(image, mapContent);
if (chooser.isJpegPreferred()) {
jpegResponse.formatImageOutputStream(image, outStream, mapContent);
} else {
pngResponse.formatImageOutputStream(image, outStream, mapContent);
}
}
@Override
public MapProducerCapabilities getCapabilities(String outputFormat) {
return CAPABILITIES;
}
}