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

org.kohsuke.stapler.StaplerRequest Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2004-2010, Kohsuke Kawaguchi
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are permitted provided
 * that the following conditions are met:
 *
 *     * Redistributions of source code must retain the above copyright notice, this list of
 *       conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright notice, this list of
 *       conditions and the following disclaimer in the documentation and/or other materials
 *       provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package org.kohsuke.stapler;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.fileupload.FileItem;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import net.sf.json.JSONObject;
import net.sf.json.JSONArray;
import org.kohsuke.stapler.bind.BoundObjectTable;

/**
 * Defines additional parameters/operations made available by Stapler.
 *
 * @see Stapler#getCurrentRequest()
 * @author Kohsuke Kawaguchi
 */
public interface StaplerRequest extends HttpServletRequest {
    /**
     * Gets the {@link Stapler} instance that this belongs to.
     */
    Stapler getStapler();

    /**
     * Short for {@code getStapler().getWebApp()}
     */
    WebApp getWebApp();

    /**
     * Returns the additional URL portion that wasn't used by the stapler,
     * excluding the query string.
     *
     * 

* For example, if the requested URL is "foo/bar/zot/abc?def=ghi" and * "foo/bar" portion matched bar.jsp, this method returns * "/zot/abc". * *

* If this method is invoked from getters or {@link StaplerProxy#getTarget()} * during the object traversal, this method returns the path portion * that is not yet processed. * * @return * can be empty string, but never null. */ String getRestOfPath(); /** * Returns the same thing as {@link #getRestOfPath()} but in the pre-decoded form, * so all "%HH"s as present in the request URL is intact. */ String getOriginalRestOfPath(); /** * Returns the {@link ServletContext} object given to the stapler * dispatcher servlet. */ ServletContext getServletContext(); /** * Gets the {@link RequestDispatcher} that represents a specific view * for the given object. * * This support both JSP and Jelly. * * @param viewName * If this name is relative name like "foo.jsp" or "bar/zot.jelly", * then the corresponding "side file" is searched by this name. *

* For Jelly, this also accepts absolute path name that starts * with '/', such as "/foo/bar/zot.jelly". In this case, * it.getClass().getClassLoader() is searched for this script. * * @return null * if neither JSP nor Jelly is not found by the given name. */ RequestDispatcher getView(Object it,String viewName) throws IOException; /** * Gets the {@link RequestDispatcher} that represents a specific view * for the given class. * *

* Unlike {@link #getView(Object, String)}, calling this request dispatcher * doesn't set the "it" variable, so * {@code getView(it.getClass(),viewName)} and {@code getView(it,viewName)} * aren't the same thing. */ RequestDispatcher getView(Class clazz,String viewName) throws IOException; /** * Gets the part of the request URL from protocol up to the context path. * So typically it's something like http://foobar:8080/something */ String getRootPath(); /** * Gets the referer header (like "http://foobar.com/zot") or null. * * This is just a convenience method. */ String getReferer(); /** * Returns a list of ancestor objects that lead to the "it" object. * The returned list contains {@link Ancestor} objects sorted in the * order from root to the "it" object. * *

* For example, if the URL was "foo/bar/zot" and the "it" object * was determined as root.getFoo().getBar("zot"), * then this list will contain the following 3 objects in this order: *

    *
  1. the root object *
  2. root.getFoo() object *
  3. root.getFoo().getBar("zot") object (the "it" object) *
*

* * * @return * list of {@link Ancestor}s. Can be empty, but always non-null. */ List getAncestors(); /** * Finds the nearest ancestor that has the object of the given type, or null if not found. */ Ancestor findAncestor(Class type); /** * Short for {@code findAncestor(type).getObject()}, with proper handling for null de-reference. * This version is also type safe. */ T findAncestorObject(Class type); /** * Finds the nearest ancestor whose {@link Ancestor#getObject()} matches the given object. */ Ancestor findAncestor(Object o); /** * Short for {@code getParameter(name)!=null} */ boolean hasParameter(String name); /** * Gets the {@link HttpServletRequest#getRequestURI() request URI} * of the original request, so that you can access the value even from * JSP. */ String getOriginalRequestURI(); /** * Checks "If-Modified-Since" header and returns false * if the resource needs to be served. * *

* This method can behave in three ways. * *

    *
  1. If timestampOfResource is 0 or negative, * this method just returns false. * *
  2. If "If-Modified-Since" header is sent and if it's bigger than * timestampOfResource, then this method sets * {@link HttpServletResponse#SC_NOT_MODIFIED} as the response code * and returns true. * *
  3. Otherwise, "Last-Modified" header is added with timestampOfResource value, * and this method returns false. *
* *

* This method sends out the "Expires" header to force browser * to re-validate all the time. * * @param timestampOfResource * The time stamp of the resource. * @param rsp * This object is updated accordingly to simplify processing. * * @return * false to indicate that the caller has to serve the actual resource. * true to indicate that the caller should just quit processing right there * (and send back {@link HttpServletResponse#SC_NOT_MODIFIED}. */ boolean checkIfModified(long timestampOfResource, StaplerResponse rsp); /** * @see #checkIfModified(long, StaplerResponse) */ boolean checkIfModified(Date timestampOfResource, StaplerResponse rsp); /** * @see #checkIfModified(long, StaplerResponse) */ boolean checkIfModified(Calendar timestampOfResource, StaplerResponse rsp); /** * @param expiration * The number of milliseconds until the resource will "expire". * Until it expires the browser will be allowed to cache it * and serve it without checking back with the server. * After it expires, the client will send conditional GET to * check if the resource is actually modified or not. * If 0, it will immediately expire. * * @see #checkIfModified(long, StaplerResponse) */ boolean checkIfModified(long timestampOfResource, StaplerResponse rsp, long expiration); /** * Binds form parameters to a bean by using introspection. * * For example, if there's a parameter called 'foo' that has value 'abc', * then bean.setFoo('abc') will be invoked. This will be repeated * for all parameters. Parameters that do not have corresponding setters will * be simply ignored. * *

* Values are converted into the right type. See {@link ConvertUtils#convert(String, Class)}. * * @see BeanUtils#setProperty(Object, String, Object) * * @param bean * The object which will be filled out. */ void bindParameters( Object bean ); /** * Binds form parameters to a bean by using introspection. * * This method works like {@link #bindParameters(Object)}, but it performs a * pre-processing on property names. Namely, only property names that start * with the given prefix will be used for binding, and only the portion of the * property name after the prefix is used. * * So for example, if the prefix is "foo.", then property name "foo.bar" with value * "zot" will invoke bean.setBar("zot"). */ void bindParameters( Object bean, String prefix ); /** * Binds collection form parameters to beans by using introspection or * constructor parameters injection. * *

* This method works like {@link #bindParameters(Object,String)} and * {@link #bindParameters(Class, String)}, but it assumes * that form parameters have multiple-values, and use individual values to * fill in multiple beans. * *

* For example, if getParameterValues("foo")=={"abc","def"} * and getParameterValues("bar")=={"5","3"}, then this method will * return two objects (the first with "abc" and "5", the second with * "def" and "3".) * * @param type * Type of the bean to be created. This class must have the default no-arg * constructor. * * @param prefix * See {@link #bindParameters(Object, String)} for details. * * @return * Can be empty but never null. */ List bindParametersToList( Class type, String prefix ); /** * Instanciates a new object by injecting constructor parameters from the form parameters. * *

* The given class must have a constructor annotated with '@stapler-constructor', * and must be processed by the maven-stapler-plugin, so that the parameter names * of the constructor is available at runtime. * *

* The prefix is used to control the form parameter name. For example, * if the prefix is "foo." and if the constructor is define as * Foo(String a, String b), then the constructor will be invoked * as new Foo(getParameter("foo.a"),getParameter("foo.b")). */ T bindParameters( Class type, String prefix ); /** * Works like {@link #bindParameters(Class, String)} but uses n-th value * of all the parameters. * *

* This is useful for creating multiple instances from repeated form fields. */ T bindParameters( Class type, String prefix, int index ); /** * Data-bind from a {@link JSONObject} to the given target type, * by using introspection or constructor parameters injection. * *

* For example, if you have a constructor that looks like the following: * *

     * class Foo {
     *   @{@link DataBoundConstructor}
     *   public Foo(Integer x, String y, boolean z, Bar bar) { ... }
     * }
     *
     * class Bar {
     *   @{@link DataBoundConstructor}
     *   public Bar(int x, int y) {}
     * }
     * 
* * ... and if JSONObject looks like * *
{ y:"text", z:true, bar:{x:1,y:2}}
* * then, this method returns * *
new Foo(null,"text",true,new Bar(1,2))
* *

Sub-typing

*

* In the above example, a new instance of Bar was created, * but you can also create a subtype of Bar by having the 'stapler-class' property in * JSON like this: * *

     * class BarEx extends Bar {
     *   @{@link DataBoundConstructor}
     *   public BarEx(int a, int b, int c) {}
     * }
     *
     * { y:"text", z:true, bar: { stapler-class:"p.k.g.BarEx", a:1, b:2, c:3 } }
     * 
* *

* The type that shows up in the constructor (Bar in this case) * can be an interface or an abstract class. */ T bindJSON(Class type, JSONObject src); /** * Data-bind from one of the JSON object types ({@link JSONObject}, {@link JSONArray}, * {@link String}, {@link Integer}, and so on) to the expected type given as an argument. * * @param genericType * The generic type of the 'erasure' parameter. * @param erasure * The expected type to convert the JSON argument to. * @param json * One of the JSON value type. */ T bindJSON(Type genericType, Class erasure, Object json); /** * Data-binds from {@link JSONObject} to the given object. * *

* This method is bit like {@link #bindJSON(Class, JSONObject)}, except that this method * populates an existing object, instead of creating a new instance. * *

* This method is also bit like {@link #bindParameters(Object, String)}, in that it * populates an existing object from a form submission, except that this method * obtains data from {@link JSONObject} thus more structured, whereas {@link #bindParameters(Object, String)} * uses the map structure of the form submission. */ void bindJSON( Object bean, JSONObject src ); /** * Data-bind from either {@link JSONObject} or {@link JSONArray} to a list, * by using {@link #bindJSON(Class, JSONObject)} as the lower-level mechanism. * *

* If the source is {@link JSONObject}, the returned list will contain * a single item. If it is {@link JSONArray}, each item will be bound. * If it is null, then the list will be empty. */ List bindJSONToList(Class type, Object src); /** * Gets the {@link BindInterceptor} set for this request. */ BindInterceptor getBindInterceptor(); BindInterceptor setBindListener(BindInterceptor bindListener); /** * Gets the content of the structured form submission. * * @see Structured Form Submission */ JSONObject getSubmittedForm() throws ServletException; /** * Obtains a commons-fileupload object that represents an uploaded file. * * @return * null if a file of the given form field name doesn't exist. * This includes the case where the name corresponds to a simple * form field (like textbox, checkbox, etc.) */ FileItem getFileItem(String name) throws ServletException, IOException; /** * Returns true if this request represents a server method call to a JavaScript proxy object. */ boolean isJavaScriptProxyCall(); /** * Short cut for obtaining {@link BoundObjectTable} associated with this webapp. */ BoundObjectTable getBoundObjectTable(); /** * Exports the given Java object as a JavaScript proxy and returns a JavaScript expression to create * a proxy on the client side. * * Short cut for {@code getBoundObjectTable().bind(toBeExported).getProxyScript()} */ String createJavaScriptProxy(Object toBeExported); }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy