/* 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.wms.responses; import java.io.IOException; import java.io.OutputStream; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import org.geoserver.config.GeoServer; import org.geoserver.config.ServiceInfo; import org.geoserver.platform.GeoServerExtensions; import org.geoserver.platform.ServiceException; import org.springframework.context.ApplicationContext; import org.vfny.geoserver.Request; import org.vfny.geoserver.Response; import org.vfny.geoserver.wms.GetLegendGraphicProducer; import org.vfny.geoserver.wms.GetLegendGraphicProducerSpi; import org.vfny.geoserver.wms.WmsException; import org.vfny.geoserver.wms.requests.GetLegendGraphicRequest; /** * DOCUMENT ME! * * @author Gabriel Roldan, Axios Engineering * @version $Id$ */ public class GetLegendGraphicResponse implements Response { /** DOCUMENT ME! */ private static final Logger LOGGER = org.geotools.util.logging.Logging.getLogger(GetLegendGraphicResponse.class.getPackage() .getName()); /** * The legend graphic producer that will be used for the production of a legend in the * requested format. */ private GetLegendGraphicProducer delegate; /** * Application Context */ private ApplicationContext applicationContext; /** * Creates a new GetLegendGraphicResponse object. * * @param applicationContext */ public GetLegendGraphicResponse(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } /** * Returns any extra headers that this service might want to set in the HTTP response object. * @see org.vfny.geoserver.Response#getResponseHeaders() */ public HashMap getResponseHeaders() { return null; } /** * DOCUMENT ME! * * @param req DOCUMENT ME! * * @throws ServiceException DOCUMENT ME! */ public void execute(Request req) throws ServiceException { GetLegendGraphicRequest request = (GetLegendGraphicRequest) req; final String outputFormat = request.getFormat(); this.delegate = getDelegate(outputFormat); this.delegate.produceLegendGraphic(request); } /** * @see Response#getContentType(GeoServer) */ public String getContentType(GeoServer gs) throws IllegalStateException { if (this.delegate == null) { throw new IllegalStateException("No request has been processed"); } return this.delegate.getContentType(); } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public String getContentEncoding() { if (LOGGER.isLoggable(Level.FINER)) { LOGGER.finer("returning content encoding null"); } return null; } /** * Asks the GetLegendGraphicProducer obtained in execute() to abort the * process. * * @param gs not used. * @see Response#abort(ServiceInfo) */ public void abort(ServiceInfo gs) { if (this.delegate != null) { if (LOGGER.isLoggable(Level.FINE)) { LOGGER.fine("asking delegate for aborting the process"); } this.delegate.abort(); } } /** * DOCUMENT ME! * * @param out DOCUMENT ME! * * @throws ServiceException DOCUMENT ME! * @throws IOException DOCUMENT ME! * @throws IllegalStateException DOCUMENT ME! */ public void writeTo(OutputStream out) throws ServiceException, IOException { try { // mapcontext can leak memory -- we make sure we done (see // finally block) if (this.delegate == null) { throw new IllegalStateException( "No GetMapDelegate is setted, make sure you have called execute and it has succeed"); } if (LOGGER.isLoggable(Level.FINER)) { LOGGER.finer(new StringBuffer("asking delegate for write to ").append(out).toString()); } this.delegate.writeTo(out); } catch (Exception e) // we dont want to propogate a new error { if (LOGGER.isLoggable(Level.FINER)) { LOGGER.finer(new StringBuffer("asking delegate for write to ").append(out).toString()); } } } /** * Creates a GetMapDelegate specialized in generating the requested map * format * * @param outputFormat * a request parameter object wich holds the processed request * objects, such as layers, bbox, outpu format, etc. * * @return A specialization of <code>GetMapDelegate</code> wich can * produce the requested output map format * * @throws WmsException * if no specialization is configured for the output format * specified in <code>request</code> or if it can't be * instantiated */ private GetLegendGraphicProducer getDelegate(String outputFormat) throws WmsException { Collection producers = GeoServerExtensions.extensions(GetLegendGraphicProducerSpi.class); GetLegendGraphicProducerSpi factory; for (Iterator iter = producers.iterator(); iter.hasNext();) { factory = (GetLegendGraphicProducerSpi) iter.next(); if (factory.canProduce(outputFormat)) { return factory.createLegendProducer(outputFormat); } } throw new WmsException("There is no support for creating legends in " + outputFormat + " format", "InvalidFormat"); } /** * Utility method to ask all the available legend graphic producer * factories if they support the production of a legend graphic in the * format specified. * * @param mimeType the MIME type of the desired legend format (e.g. * "image/png"). * * @return wether a legend producer can manage the specified format or not. * * @deprecated use {@link #supportsFormat(String)} */ public static boolean supportsFormat(String mimeType, ApplicationContext context) { return supportsFormat(mimeType); } /** * Utility method to ask all the available legend graphic producer * factories if they support the production of a legend graphic in the * format specified. * * @param mimeType the MIME type of the desired legend format (e.g. * "image/png"). * * @return wether a legend producer can manage the specified format or not. * */ public static boolean supportsFormat(String mimeType) { return loadLegendFormats().contains(mimeType); } /** * Convenient method to search and return all the supported image formats * for the creation of legend graphics. * * @return the set of all the supported legend graphic formats. * * @deprecated use {@link #getFormats()} */ public static Set getFormats(ApplicationContext context) { return getFormats(); } /** * Convenient method to search and return all the supported image formats * for the creation of legend graphics. * * @return the set of all the supported legend graphic formats. */ public static Set getFormats() { return loadLegendFormats(); } /** * Convenience method for processing the GetLegendGraphicProducerSpi extension * point and returning the set of available image formats. */ private static Set loadLegendFormats() { Collection producers = GeoServerExtensions.extensions(GetLegendGraphicProducerSpi.class); Set formats = new HashSet(); GetLegendGraphicProducerSpi producer; for (Iterator iter = producers.iterator(); iter.hasNext();) { producer = (GetLegendGraphicProducerSpi) iter.next(); formats.addAll(producer.getSupportedFormats()); } return formats; } public String getContentDisposition() { return null; } }