/* Copyright (c) 2001 - 2007 TOPP - www.openplans.org. All rights reserved. * This code is licensed under the GPL 2.0 license, availible at the root * application directory. */ package org.vfny.geoserver.wcs.responses.coverage; import java.io.IOException; import java.io.OutputStream; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import org.geoserver.platform.ServiceException; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.gce.image.WorldImageWriter; import org.opengis.coverage.grid.Format; import org.opengis.parameter.GeneralParameterValue; import org.opengis.parameter.ParameterValue; import org.opengis.parameter.ParameterValueGroup; import org.vfny.geoserver.wcs.responses.CoverageResponseDelegate; /** * DOCUMENT ME! * * @author $Author: Alessio Fabiani (alessio.fabiani@gmail.com) $ (last modification) * @author $Author: Simone Giannecchini (simboss1@gmail.com) $ (last modification) */ @SuppressWarnings("deprecation") public class IMGCoverageResponseDelegate implements CoverageResponseDelegate { private static final Set<String> FORMATS = new HashSet<String>(Arrays.asList("image/bmp", "image/gif", "image/tiff", "image/png", "image/jpeg")); /** * * @uml.property name="sourceCoverage" * @uml.associationEnd multiplicity="(0 1)" */ private GridCoverage2D sourceCoverage; private String outputFormat; public IMGCoverageResponseDelegate() { } public boolean canProduce(String outputFormat) { return outputFormat != null && (FORMATS.contains(outputFormat.toLowerCase()) || FORMATS.contains("image/" + outputFormat.toLowerCase())); } public String getMimeFormatFor(String outputFormat) { if (!canProduce(outputFormat)) return null; if (FORMATS.contains(outputFormat.toLowerCase())) return outputFormat; String mime = "image/" + outputFormat.toLowerCase(); if (FORMATS.contains(mime)) return mime; return null; } public void prepare(String outputFormat, GridCoverage2D coverage) throws IOException { this.outputFormat = outputFormat.startsWith("image/") ? outputFormat.substring(6) : outputFormat; this.sourceCoverage = coverage; } public String getContentType() { return new StringBuffer("image/").append(outputFormat.toLowerCase()).toString(); } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public String getContentEncoding() { return null; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public String getContentDisposition() { return (outputFormat.equalsIgnoreCase("tiff") || outputFormat.equalsIgnoreCase("tif")) ? new StringBuffer( "attachment;filename=").append(this.sourceCoverage.getName()).append(".").append( outputFormat).toString() : null; } public String getFileExtension() { return "outputFormat"; } public void encode(OutputStream output) throws ServiceException, IOException { if (sourceCoverage == null) { throw new IllegalStateException( "It seems prepare() has not been called or has not succeed"); } final WorldImageWriter writer = new WorldImageWriter(output); // writing parameters for Image final Format writerParams = writer.getFormat(); final ParameterValueGroup writeParameters = writerParams.getWriteParameters(); final ParameterValue<?> format = writeParameters.parameter("Format"); format.setValue(this.outputFormat.toLowerCase()); try{ // writing writer.write(sourceCoverage, new GeneralParameterValue[] { format }); output.flush(); }finally{ // freeing everything org.apache.commons.io.IOUtils.closeQuietly(output); try{ writer.dispose(); }catch (Throwable e) { // eat me } this.sourceCoverage.dispose(false); this.sourceCoverage = null; } } }