/* 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.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.charset.Charset; import java.util.HashMap; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.transform.TransformerException; import org.geoserver.config.ServiceInfo; import org.geoserver.ows.util.RequestUtils; import org.geoserver.platform.ServiceException; import org.vfny.geoserver.Request; import org.vfny.geoserver.Response; import org.vfny.geoserver.wms.WmsException; import org.vfny.geoserver.wms.requests.DescribeLayerRequest; import org.vfny.geoserver.wms.responses.helpers.DescribeLayerTransformer; /** * Executes a <code>DescribeLayer</code> WMS request. * * <p> * Recieves 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, Axios Engineering * @version $Id$ */ public class DescribeLayerResponse implements Response { /** DOCUMENT ME! */ private static final Logger LOGGER = org.geotools.util.logging.Logging .getLogger(DescribeLayerResponse.class.getPackage().getName()); public static final String DESCLAYER_MIME_TYPE = "application/vnd.ogc.wms_xml"; /** the request holding the required FeatureTypeInfo's */ private DescribeLayerRequest request; /** * the transformer wich takes care of xmlencoding the DescribeLayer response */ private DescribeLayerTransformer transformer; /** the raw XML content ready to be sent to the client */ private byte[] content; /** * 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 request * DOCUMENT ME! * * @throws ServiceException * DOCUMENT ME! * @throws WmsException * DOCUMENT ME! */ public void execute(Request request) throws ServiceException { this.request = (DescribeLayerRequest) request; if (LOGGER.isLoggable(Level.FINE)) { LOGGER.fine(new StringBuffer("executing request ").append(request).toString()); } this.transformer = new DescribeLayerTransformer(this.request.getBaseUrl()); this.transformer.setNamespaceDeclarationEnabled(false); Charset encoding = this.request.getWMS().getCharSet(); this.transformer.setEncoding(encoding); if (request.getServiceConfig().isVerbose()) { this.transformer.setIndentation(2); } ByteArrayOutputStream out = new ByteArrayOutputStream(); try { transformer.transform(this.request, out); } catch (TransformerException e) { throw new WmsException(e); } this.content = out.toByteArray(); } /** * Writes this respone to the provided output stream. * * @param out * DOCUMENT ME! * * @throws ServiceException * never. * @throws IOException * if it is thrown while writing the response content to <code>out</code>. * @throws IllegalStateException * if <code>execute()</code> has not been called or does not succeed (i.e.: * <code>this.content == * null</code>). */ public void writeTo(OutputStream out) throws ServiceException, IOException { if (this.content == null) { throw new IllegalStateException("execute() has not been called or does not succeed."); } out.write(this.content); } /** * Returns <code>null</code> since no special encoding is applyed to the response content. * * @return <code>null</code> */ public String getContentEncoding() { return null; } /** * @see org.vfny.geoserver.Response#getContentDisposition() */ public String getContentDisposition() { return null; } public void abort(ServiceInfo gs) { // nothing to do } public String getContentType(org.geoserver.config.GeoServer gs) throws IllegalStateException { return DESCLAYER_MIME_TYPE; } }