/* (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.describelayer; import java.io.IOException; import java.io.OutputStream; import org.apache.commons.io.IOUtils; import org.geoserver.ows.Response; import org.geoserver.platform.Operation; import org.geoserver.platform.ServiceException; import org.geoserver.wms.DescribeLayer; import org.geoserver.wms.DescribeLayerRequest; import org.springframework.util.Assert; /** * Executes a <code>DescribeLayer</code> WMS request. * * <p> * Receives a <code>DescribeLayerRequest</code> object holding the references to the requested * layers and utilizes a transformer based on the org.geotools.xml.transform framework to encode the * response. * </p> * * @author Gabriel Roldan * @author Carlo Cancellieri * @version $Id$ */ public abstract class DescribeLayerResponse extends Response { private final String type; /** * Creates a new GetMapResponse object. */ public DescribeLayerResponse(String format) { super(DescribeLayerModel.class,format); this.type=format; } /** * Evaluates if this DescribeLayer producer can generate the format specified by * <code>format</code>, where <code>format</code> is the MIME type of the requested * response. * * @param format * the MIME type of the required output format, might be {@code null} * * @return true if class can produce a DescribeLayer in the passed format */ public boolean canProduce(String format) { return type.equalsIgnoreCase(format); } public String getContentType() { return type; } /** * @see org.geoserver.ows.Response#getMimeType(java.lang.Object, * org.geoserver.platform.Operation) */ @Override public String getMimeType(Object value, Operation operation) throws ServiceException { Object op = operation.getParameters()[0]; if (op instanceof DescribeLayerRequest) { DescribeLayerRequest dlr = (DescribeLayerRequest) op; return dlr.getOutputFormat(); } throw new ServiceException("Unable to parse incoming operation"); } /** * @param value * {@link DescribeLayerTransformer} * @param output * where to write the response * @param operation * {@link DescribeLayer} operation that originated the {@code value} response * @see org.geoserver.ows.Response#write(java.lang.Object, java.io.OutputStream, * org.geoserver.platform.Operation) */ @Override public void write(Object value, OutputStream output, Operation operation) throws IOException, ServiceException { Assert.notNull(operation.getParameters()); Assert.isTrue(operation.getParameters()[0] instanceof DescribeLayerRequest); final DescribeLayerRequest request = (DescribeLayerRequest) operation.getParameters()[0]; Assert.isTrue(value instanceof DescribeLayerModel); final DescribeLayerModel results = (DescribeLayerModel) value; try { write(results, request, output); } finally { if (output!=null){ try { output.flush(); } catch (IOException ioe){} IOUtils.closeQuietly(output); } } } public abstract void write(DescribeLayerModel description, DescribeLayerRequest output, OutputStream operation) throws IOException, ServiceException ; }