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

ninja.Context Maven / Gradle / Ivy

/**
 * Copyright (C) 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package ninja;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

import ninja.bodyparser.BodyParserEngineJson;
import ninja.bodyparser.BodyParserEngineManager;
import ninja.bodyparser.BodyParserEngineXml;
import ninja.session.FlashScope;
import ninja.session.Session;
import ninja.uploads.FileItem;
import ninja.uploads.FileItemProvider;
import ninja.uploads.FileProvider;
import ninja.utils.ResponseStreams;
import ninja.validation.Validation;

import org.apache.commons.fileupload.FileItemIterator;

public interface Context {

    /**
     * Impl is used to hide stuff that a user should not see on 
     * code completion. Internal stuff like setting routes should go here.
     */
    interface Impl extends Context {
        
        void setRoute(Route route);
    }

    /**
     * Content-Type: ... parameter for response.
     */
    public String CONTENT_TYPE = "Content-Type";

    /**
     * X Forwarded for header, used when behind fire walls and proxies.
     */
    public String X_FORWARD_HEADER = "X-Forwarded-For";
    
    /**
     * Used to enable or disable usage of X-Forwarded-For header in
     * getRemoteAddr(). Can be set in application.conf to true or false. If
     * not set it's assumed to be false;
     */
    public String NINJA_PROPERTIES_X_FORWARDED_FOR = "ninja.x_forwarded_for_enabled";
        
    /**
     * please use Result.SC_*
     * 
     * @author rbauer
     * 
     */
    @Deprecated
    enum HTTP_STATUS {
        notFound404(404), ok200(200), forbidden403(403), teapot418(418), badRequest400(
                400), noContent204(204), created201(201);
        public final int code;

        private HTTP_STATUS(int code) {
            this.code = code;
        }
    }

    /**
     * The Content-Type header field indicates the media type of the request
     * body sent to the recipient. E.g. {@code Content-Type: text/html;
     * charset=ISO-8859-4}
     *
     * @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
     *
     * @return the content type of the incoming request.
     */
    String getRequestContentType();

    /**
     * Returns the uri as seen by the server.
     * 
     * http://example.com/index would return "/index".
     * 
     * This is ambiguous.
     * 
     * Please use the new method getRequestPath. It will also take care of any
     * prefixes and contexts set by your servlet container
     * 
     * @return the uri as seen by the server
     */
    @Deprecated
    String getRequestUri();

    /**
     * Returns the hostname as seen by the server.
     *
     * http://example.com/index would return "example.com".
     *
     * @return the host name as seen by the server
     */
    String getHostname();

    /**
     * For instance:
     * http://example.com/index returns "http".
     * https://example.com/index returns "https".
     *
     * @return the scheme of the request as seen by the server (e.g. "http" or "https").
     */
    String getScheme();

    /**
     * Returns the Internet Protocol (IP) address of the client
     * or last proxy that sent the request. For HTTP servlets, same as the 
     * value of the CGI variable REMOTE_ADDR.
     * 
     * To honour the X-Forwarded-For flag make sure you set 
     * "ninja.ninja.x_forwarded_for_enabled=true" in your application.conf. Default
     * behavior is NOT to take X-Forwarded-For flag into account.
     *
     * @return a String containing the
     *         IP address of the client that sent the request. Takes into 
     *         account X-Forwarded-For header if configured to do so.
     */
    public String getRemoteAddr();

    /**
     * Returns the path that Ninja should act upon.
     * 
     * For instance in servlets you could have soemthing like a context prefix.
     * /myContext/app
     * 
     * If your route only defines /app it will work as the requestpath will
     * return only "/app". A context path is not returned.
     * 
     * It does NOT decode any parts of the url.
     * 
     * Interesting reads: -
     * http://www.lunatech-research.com/archives/2009/02/03/
     * what-every-web-developer-must-know-about-url-encoding -
     * http://stackoverflow
     * .com/questions/966077/java-reading-undecoded-url-from-servlet
     * 
     * @return The the path as seen by the server. Does exclude any container
     *         set context prefixes. Not decoded.
     */
    String getRequestPath();

    /**
     * Returns the flash cookie. Flash cookies only live for one request. Good
     * uses are error messages to display. Almost everything else is bad use of
     * Flash Cookies.
     * A FlashScope is usually not signed. Don't trust the content.
     * 
     * @return the flash scope of that request.
     */
    FlashScope getFlashScope();
    
    /**
     * Deprecated  => please use getFlashScope()
     * @return FlashScope of this request.
     */
    @Deprecated
    FlashScope getFlashCookie();

    /**
     * Returns the client side session. It is a cookie. Therefore you cannot
     * store a lot of information inside the cookie. This is by intention.
     * 
     * If you have the feeling that the session cookie is too small for what you
     * want to achieve thing again. Most likely your design is wrong.
     * 
     * @return the Session of that request / response cycle.
     */
    Session getSession();
    
    /**
     * Deprecated => please use getSession();
     * @return the Session of that request / response cycle.
     */
    @Deprecated
    Session getSessionCookie();
    
    /**
     * Get cookie from context.
     * 
     * @param cookieName
     *            Name of the cookie to retrieve
     * @return the cookie with that name or null.
     */
    Cookie getCookie(String cookieName);
    
    /**
     * Checks whether the context contains a given cookie.
     *
     * @param cookieName
     *            Name of the cookie to check for
     * @return {@code true} if the context has a cookie with that name.
     */
    boolean hasCookie(String cookieName);

    /**
     * Get all cookies from the context.
     * 
     * @return the cookie with that name or null.
     */
    List getCookies();
    
    /**
     * Get the context path on which the application is running
     * 
     * That means:
     * - when running on root the context path is empty
     * - when running on context there is NEVER a trailing slash
     * 
     * We conform to the following rules:
     * Returns the portion of the request URI that indicates the context of the 
     * request. The context path always comes first in a request URI. 
     * The path starts with a "/" character but does not end with a "/" character. 
     * For servlets in the default (root) context, this method returns "". 
     * The container does not decode this string.
     * 
     * As outlined by: http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#getContextPath()
     * 
     * @return the context-path with a leading "/" or "" if running on root
     */
    String getContextPath();

    /**
     * Get the parameter with the given key from the request. The parameter may
     * either be a query parameter, or in the case of form submissions, may be a
     * form parameter.
     * 

* When the parameter is multivalued, returns the first value. *

* The parameter is decoded by default. * * @param name * The key of the parameter * @return The value, or null if no parameter was found. * @see #getParameterValues */ String getParameter(String name); /** * Get the parameter with the given key from the request. The parameter may * either be a query parameter, or in the case of form submissions, may be a * form parameter. *

* The parameter is decoded by default. * * @param name * The key of the parameter * @return The values, possibly an empty list. */ List getParameterValues(String name); /** * Same like {@link #getParameter(String)}, but returns given defaultValue * instead of null in case parameter cannot be found. * * The parameter is decoded by default. * * @param name * The name of the post or query parameter * @param defaultValue * A default value if parameter not found. * @return The value of the parameter of the defaultValue if not found. */ String getParameter(String name, String defaultValue); /** * Same like {@link #getParameter(String)}, but converts the parameter to * Integer if found. * * The parameter is decoded by default. * * @param name * The name of the post or query parameter * @return The value of the parameter or null if not found. */ Integer getParameterAsInteger(String name); /** * Same like {@link #getParameter(String, String)}, but converts the * parameter to Integer if found. * * The parameter is decoded by default. * * @param name * The name of the post or query parameter * @param defaultValue * A default value if parameter not found. * @return The value of the parameter of the defaultValue if not found. */ Integer getParameterAsInteger(String name, Integer defaultValue); /** * Same like {@link #getParameter(String, String)}, but converts the * parameter to File if found. * * The parameter is read from the multipart stream, using the FileProvider declared * on the route method, class. * * @param name * The name of the post or query parameter * @return The value of the parameter or null if not found. */ FileItem getParameterAsFileItem(String name); /** * Get the files parameter with the given key from the request. * * @param name * The key of the parameter * @return The values, possibly an empty list. */ List getParameterAsFileItems(String name); /** * Get all the file parameters from the request * * @return The parameters, possibly a null map. */ Map> getParameterFileItems(); /** * Same like {@link #getParameter(String)}, but converts the parameter to * Class type if found. * * The parameter is decoded by default. * * @param name * The name of the post or query parameter * @return The value of the parameter or null if not found. */ T getParameterAs(String name, Class clazz); /** * Same like {@link #getParameter(String, String)}, but converts the * parameter to Class type if found. * * The parameter is decoded by default. * * @param name * The name of the post or query parameter * @param defaultValue * A default value if parameter not found. * @return The value of the parameter of the defaultValue if not found. */ T getParameterAs(String name, Class clazz, T defaultValue); /** * Get the path parameter for the given key. * * The parameter will be decoded based on the RFCs. * * Check out http://docs.oracle.com/javase/6/docs/api/java/net/URI.html for * more information. * * @param name * The name of the path parameter in a route. Eg * /{myName}/rest/of/url * @return The decoded path parameter, or null if no such path parameter was * found. */ String getPathParameter(String name); /** * Get the path parameter for the given key. * * Returns the raw path part. That means you can get stuff like: * blue%2Fred%3Fand+green * * @param name * The name of the path parameter in a route. Eg * /{myName}/rest/of/url * @return The encoded (!) path parameter, or null if no such path parameter * was found. */ String getPathParameterEncoded(String name); /** * Get the path parameter for the given key and convert it to Integer. * * The parameter will be decoded based on the RFCs. * * Check out http://docs.oracle.com/javase/6/docs/api/java/net/URI.html for * more information. * * @param key * the key of the path parameter * @return the numeric path parameter, or null of no such path parameter is * defined, or if it cannot be parsed to int */ Integer getPathParameterAsInteger(String key); /** * Get all the parameters from the request * * @return The parameters */ Map getParameters(); /** * Get the (first) request header with the given name * * @return The header value */ String getHeader(String name); /** * Get all the request headers with the given name. * * @return the header values */ List getHeaders(String name); /** * Get all the headers from the request * * @return The headers */ Map> getHeaders(); /** * Get the cookie value from the request, if defined * * @param name * The name of the cookie * @return The cookie value, or null if the cookie was not found */ String getCookieValue(String name); // ///////////////////////////////////////////////////////////////////////// // Allows to get the nicely parsed content of the request. // For instance if the content is a json you could simply get the json // as Java object. // ///////////////////////////////////////////////////////////////////////// /** * This will give you the request body nicely parsed. You can register your * own parsers depending on the request type. * * Have a look at {@link ninja.bodyparser.BodyParserEngine} * {@link BodyParserEngineJson} {@link BodyParserEngineXml} * and {@link BodyParserEngineManager} * * @param classOfT * The class of the result. * @return The parsed request or null if something went wrong. */ T parseBody(Class classOfT); boolean isAsync(); /** * Indicate that this request is going to be handled asynchronously */ void handleAsync(); /** * Indicate that request processing of an async request is complete. */ void returnResultAsync(Result result); /** * Indicate that processing this request is complete. */ void asyncRequestComplete(); Result controllerReturned(); /** * Finalizing the headers copies all stuff into the headers. It * of course also handles Ninja session and Flash information. * * After finalizing the headers you can access the responseStreams. */ ResponseStreams finalizeHeaders(Result result); /** * Finalizing the headers copies all stuff into the headers. * * After finalizing the headers you can access the responseStreams. * * This method does not set any Ninja session of flash information. * Eg. When serving static assets this is the method you may want to * use. Otherwise you'd get a race condition with a lot of requests * setting scopes and deleting them immediately. */ ResponseStreams finalizeHeadersWithoutFlashAndSessionCookie(Result result); /** * Get the input stream to read the request. * * Must not be used if getReader has been called. * * @return The input stream */ InputStream getInputStream() throws IOException; /** * Get the reader to read the request. * * Must not be used if getInputStream has been called. * * @return The reader */ BufferedReader getReader() throws IOException; /** * Get the route for this context * * @return The route */ Route getRoute(); /** * Check if request is of type multipart. Important when you want to process * uploads for instance. * * Also check out: http://commons.apache.org/fileupload/streaming.html * * @return true if request is of type multipart. */ boolean isMultipart(); /** * Gets the FileItemIterator of the input. * * Can be used to process uploads in a streaming fashion. Check out: * http://commons.apache.org/fileupload/streaming.html * * @return the FileItemIterator of the request or null if there was an * error. * * @deprecated This method is kept for backward compatibility, use {@link FileProvider} * to specify which {@link FileItemProvider} should be used to handle uploaded files, and * access them using {@link #getParameterAsFileItem(String)}. */ @Deprecated FileItemIterator getFileItemIterator(); /** * Get the validation context * * @return The validation context */ Validation getValidation(); /** * Get the content type that is acceptable for the client. (in this order : * {@see Result.TEXT_HTML} > {@see Result.APPLICATION_XML} > {@see * Result.APPLICATION_JSON} > {@see Result.TEXT_PLAIN} > {@see * Result.APPLICATION_OCTET_STREAM} level- or quality-parameter are ignored * with this method.) E.g. Accept: text/*;q=0.3, text/html;q=0.7, * text/html;level=1,text/html;level=2;q=0.4 * * The Accept request-header field can be used to specify certain media * types which are acceptable for the response. Accept headers can be used * to indicate that the request is specifically limited to a small set of * desired types, as in the case of a request for an in-line image. * * @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html * * @return one of the {@see Result} mime types that is acceptable for the * client or {@see Result.TEXT_HTML} if not set */ String getAcceptContentType(); /** * Get the encoding that is acceptable for the client. E.g. Accept-Encoding: * compress, gzip * * The Accept-Encoding request-header field is similar to Accept, but * restricts the content-codings that are acceptable in the response. * * @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html * * @return the encoding that is acceptable for the client */ String getAcceptEncoding(); /** * Get the language that is acceptable for the client. E.g. Accept-Language: * da, en-gb;q=0.8, en;q=0.7 * * The Accept-Language request-header field is similar to Accept, but * restricts the set of natural languages that are preferred as a response * to the request. * * @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html * * @return the language that is acceptable for the client */ String getAcceptLanguage(); /** * Get the charset that is acceptable for the client. E.g. Accept-Charset: * iso-8859-5, unicode-1-1;q=0.8 * * The Accept-Charset request-header field can be used to indicate what * character sets are acceptable for the response. This field allows clients * capable of understanding more comprehensive or special- purpose character * sets to signal that capability to a server which is capable of * representing documents in those character sets. * * @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html * * @return the charset that is acceptable for the client */ String getAcceptCharset(); /** * * Returns the name of the HTTP method with which this * request was made, for example, GET, POST, or PUT. * Same as the value of the CGI variable REQUEST_METHOD. * * @return a String * specifying the name * of the method with which * this request was made (eg GET, POST, PUT...) * */ String getMethod(); /** * Gets an attribute value previously set by {@link #setAttribute}. *

* Attributes are shared state for the duration of the request; * useful to pass values between {@link Filter filters} and * controllers. * * @return the attribute value, or {@code null} if the attribute does * not exist */ Object getAttribute(String name); /** * Gets an attribute value previously set by {@link #setAttribute}. *

* This is a convenience method, equivalent to: *


     *     return clazz.cast(getAttribute(name));
     * 
*

* Attributes are shared state for the duration of the request; * useful to pass values between {@link Filter filters} and * controllers. * * @return the attribute value, or {@code null} if the attribute does * not exist */ T getAttribute(String name, Class clazz); /** * Sets an attribute value. *

* Attributes are shared state for the duration of the request; * useful to pass values between {@link Filter filters} and * controllers. * * @see #getAttribute(String) * @see #getAttribute(String, Class) */ void setAttribute(String name, Object value); /** * Get all the attributes from the request * * @return The attributes */ Map getAttributes(); /** * Check to see if the request content type is JSON. *

* Checks to see if the request content type has been set application/json *

* @return true if the content type is to set {@code application/json} */ boolean isRequestJson(); /** * Check to see if the request content type is XML. *

* Checks to see if the request content type has been set application/xml *

* @return true if the content type is to set {@code application/xml} */ boolean isRequestXml(); /** * Adds a cookie to the response * * @param cookie Ninja cookie */ void addCookie(Cookie cookie); /** * Removes a cookie from the response * * @param cookie Ninja Cookie */ void unsetCookie(Cookie cookie); /** * Cleanup context */ void cleanup(); }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy