/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.wms.featureinfo; import java.io.IOException; import java.io.OutputStream; import java.util.logging.Logger; import net.opengis.wfs.FeatureCollectionType; import org.geoserver.platform.Operation; import org.geoserver.platform.ServiceException; import org.geoserver.wms.GetFeatureInfoRequest; import org.geotools.util.logging.Logging; /** * Base class for GetFeatureInfo delegates responsible of creating GetFeatureInfo responses in * different formats. * * <p> * Subclasses should implement one or more output formats, wich will be returned in a list of mime * type strings in <code>getSupportedFormats</code>. For example, a subclass can be created to write * one of the following output formats: * * <ul> * <li> * text/plain</li> * <li> * text/html</li> * </ul> * </p> * * <p> * This abstract class takes care of executing the request in the sense of taking the GetFeatureInfo * request parameters such as query_layers, bbox, x, y, etc., create the gt2 query objects for each * featuretype and executing it. This process leads to a set of FeatureResults objects and its * metadata, wich will be given to the <code>execute(FeatureTypeInfo[] , * FeatureResults[])</code> method, that a subclass should implement as a matter of setting up any * resource/state it needs to later encoding. * </p> * * <p> * So, it should be enough to a subclass to implement the following methods in order to produce the * requested output format: * * <ul> * <li> * execute(FeatureTypeInfo[], FeatureResults[], int, int)</li> * <li> * canProduce(String mapFormat)</li> * <li> * getSupportedFormats()</li> * <li> * writeTo(OutputStream)</li> * </ul> * </p> * * @author Gabriel Roldan * @author Chris Holmes * @version $Id$ */ public abstract class GetFeatureInfoOutputFormat { /** A logger for this class. */ protected static final Logger LOGGER = Logging.getLogger(GetFeatureInfoOutputFormat.class); private final String contentType; public GetFeatureInfoOutputFormat(final String contentType) { this.contentType = contentType; } public abstract void write(FeatureCollectionType results, GetFeatureInfoRequest request, OutputStream out) throws ServiceException, IOException; /** * Evaluates if this GetFeatureInfo producer can generate the map format specified by * <code>mapFormat</code>, where <code>mapFormat</code> is the MIME type of the requested * response. * * @param mapFormat * the MIME type of the required output format, might be {@code null} * * @return true if class can produce a map in the passed format */ public boolean canProduce(String mapFormat) { return this.contentType.equalsIgnoreCase(mapFormat); } public String getContentType() { return contentType; } /** * Returns the charset for this outputFormat. * The default implementation returns <code>null</code>, in this case no encoding should be set. * Subclasses returning text documents (CSV,HTML,JSON) should override taking into account SettingsInfo.getCharset() * as well as the specific encoding requirements of the returned format. */ public String getCharset(){ return null; } }