All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.vfny.geoserver.Response Maven / Gradle / Ivy

There is a newer version: 1.7.0
Show newest version
/* 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;

import org.vfny.geoserver.global.GeoServer;
import org.vfny.geoserver.global.Service;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;


/**
 * The Response interface serves as a common denominator for all service
 * operations that generates content.
 *
 * 

* The work flow for this kind of objects is divided in two parts: the first is * executing a request and the second writing the result to an OuputStream. *

* *
    *
  1. * Execute: execute(Request) * *
      *
    • * Executing the request means taking a Request object and, based on it's set * of request parameters, do any heavy processing necessary to produce the * response. *
    • *
    • * Once the execution has been made, the Response object should be ready to * send the response content to an output stream with minimal risk of * generating an exception. *
    • *
    • * Anyway, it is not required, even recomended, that the execution process * generates the response content itself; just that it performs any query or * processing that should generate a trapable error. *
    • *
    • * Execute may throw a ServiceException if they wish to supply a specific * response in error. As an example the WFSTransaction process has a defined * Transaction Document with provisions for reporting error information. *
    • *
    * *
  2. *
  3. * ContentType: getContentType() * *
      *
    • * Called to set the response type. Depending on the stratagy used by * AbstractService the framework may be commited to returning this type. *
    • *
    * *
  4. *
  5. * Writing: writeTo(OutputStream) * *
      *
    • * Write the response to the provided output stream. *
    • *
    • * Any exceptions thrown by this writeTo method may never reach the end user in * useable form. You should assume you are writing directly to the client. *
    • *
    * *
  6. *
* *

* Note: abort() will be called as part of error handling giving your * response subclass a chance to clean up any temporary resources it may have * required in execute() for use in writeTo(). *

* *

* This is specially usefull for streamed responses such as wfs GetFeature or * WMS GetMap, where the execution process can be used to parse parameters, * execute queries upon the corresponding data sources and leave things ready * to generate a streamed response when the consumer calls writeTo. *

* *

* * @author Gabriel Rold?n * @version $Id: Response.java 6326 2007-03-15 18:36:40Z jdeolive $ */ public interface Response { /** * Excecutes a request. If this method finalizes without throwing an * Exception, the Response instance should be ready to write the response * content through the writeTo method with the minimal posible risk of * failure other than not beeing able to write to the output stream due to * external reassons * *

* We should clarify when a ServiceException is thrown? I would assume that * a "failed" request should still result in a Response that we could * write out. *

* * @param request a Request object that implementations should cast to it's * Request specialization, wich must contain the parsed and ready * to use parameters sent by the calling client. In general, such a * Request will be created by either a KVP or XML request reader; * resulting in a Request object more usefull than a set of raw * parameters, as can be the list of feature types requested as a * set of FeatureTypeInfo objects rather than just a list of String * type names * * @throws ServiceException */ public void execute(Request request) throws ServiceException; /** * MIME type of this Response - example "text/xml". * *

* thinked to be called after excecute(), this method must return the MIME * type of the response content that will be writen when writeTo were * called *

* *

* an implementation of this interface is required to throw an * IllegalStateException if execute has not been called yet, to indicate * that an inconsistence in the work flow that may result in an * inconsistence between the response content and the content type * declared for it, if such an implementation can return different * contents based on the request that has originated it. i.e. a WMS GetMap * response will return different content encodings based on the FORMAT * requested, so it would be impossible to it knowing the exact MIME * response type if it has not processed the request yet. *

* *

* There is some MIME stuff in JDK for reference: * *

    *
  • * java.awt.datatransfer package *
  • *
  • * javax.mail.internet *
  • *
  • * and a few other places as well. *
  • *
*

* * @return the MIME type of the generated or ready to generate response * content * * @throws IllegalStateException if this method is called and execute has * not been called yet */ public String getContentType(GeoServer gs) throws IllegalStateException; /** * Returns any special content encoding this response will encode its * contents to, such as "gzip" or "deflate" * * @return the content encoding writeTo will encode with, or null if none */ public String getContentEncoding(); /** * Returns any special content disposition this response will encode its * contents to, such as "filename" and "attachement" * * @return the content disposition writeTo will encode with, or null if none * * @uml.property name="contentDisposition" multiplicity="(0 1)" */ public String getContentDisposition(); /** * Returns any extra headers that this Response might wish to have set in the * HTTP response object. * * In particular, a WMS might wish to have some external caching information added * to the HTTP response, so that caches can hang onto this map for a while and ligten * the load on geoserver. * @return */ public HashMap getResponseHeaders(); /** * Writes this respone to the provided output stream. * *

* To implememt streaming, execution is sometimes delayed until the write * opperation (for example of this see FeatureResponse). Hopefully this is * okay? GR:the idea for minimize risk error at writing time, is that * execute performs any needed query/processing, leaving to this method * just the risk of encountering an uncaught or IO exception. i.e. * FeatureResponse should execute the queries inside the execute method, * and have a set of FeatureReader's (or results) ready to be streamed * here. This approach fits well with the Chirs' idea of configuring * geoserver for speed or full conformance, wich ends in just writing * directly to the http response output stream or to a * ByteArrayOutputStream *

* JG: Consider using a Writer here? GR: I don't think so, because not all * responses will be char sequences, such as an image in a WMS GetImage * response. * * @param out * * @throws ServiceException wrapping of any unchecked exception or other * predictable exception except an IO error while writing to * out * @throws IOException ONLY if an error occurs trying to write content to * the passed OutputStream. By this way, we'll can control the * very common situation of a java.net.SocketException product of * the client closing the connection (like a user pressing it's * refresh browser button many times) */ public void writeTo(OutputStream out) throws ServiceException, IOException; /** * Called when things go horriably wrong. * *

* Used try and restore application state when things go wrong. This is * called by AbstractAction to try and recover when sending out a * ServiceException. *

* *

* Allows a Response a chance to clean up after its self when * AbstractionAction is error handling. *

*/ public void abort(Service gs); }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy