ste.web.beanshell.jetty.BeanShellUtils.java Source code

Java tutorial

Introduction

Here is the source code for ste.web.beanshell.jetty.BeanShellUtils.java

Source

/*
 * BeanShell Web
 * Copyright (C) 2012 Stefano Fornari
 *
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Affero General Public License version 3 as published by
 * the Free Software Foundation with the addition of the following permission
 * added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED
 * WORK IN WHICH THE COPYRIGHT IS OWNED BY Stefano Fornari, Stefano Fornari
 * DISCLAIMS THE WARRANTY OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program; if not, see http://www.gnu.org/licenses or write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02110-1301 USA.
 */
package ste.web.beanshell.jetty;

import ste.web.beanshell.*;
import bsh.EvalError;
import bsh.Interpreter;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Enumeration;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.protocol.HttpContext;
import org.apache.http.protocol.HttpCoreContext;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;

import static ste.web.beanshell.Constants.*;
import ste.web.http.BasicHttpConnection;
import ste.web.http.HttpSessionContext;
import ste.web.http.HttpUtils;
import ste.web.http.QueryString;

/**
 *
 * @author ste
 */
public class BeanShellUtils extends ste.web.beanshell.BeanShellUtils {

    // ---------------------------------------------------------- Public methods

    public static void setup(final Interpreter interpreter, final HttpServletRequest request,
            final HttpServletResponse response) throws EvalError, IOException {
        //
        // Set attributes as script variables
        //
        String k, key;
        for (Enumeration e = request.getAttributeNames(); e.hasMoreElements();) {
            k = (String) e.nextElement();
            key = normalizeVariableName(k);
            interpreter.set(key, request.getAttribute(k));
        }

        //
        // Set request parameters as script variables. Note that parameters
        // override attributes
        //
        for (Enumeration e = request.getParameterNames(); e.hasMoreElements();) {
            k = (String) e.nextElement();
            key = normalizeVariableName(k);
            interpreter.set(key, request.getParameter(k));
        }

        interpreter.set(VAR_REQUEST, request);
        interpreter.set(VAR_RESPONSE, response);
        interpreter.set(VAR_SESSION, request.getSession(false));
        interpreter.set(VAR_OUT, response.getWriter());
        interpreter.set(VAR_LOG, log);
        if (hasJSONBody(request)) {
            interpreter.set(VAR_BODY, getJSONBody(request.getInputStream()));
        }
    }

    /**
     * Cleans up request variables so that they won't be set in next invocations
     *
     * @param interpreter the beanshell interpreter
     * @param request the request
     *
     */
    public static void cleanup(final Interpreter interpreter, final HttpServletRequest request) throws EvalError {
        Enumeration<String> params = request.getParameterNames();
        while (params.hasMoreElements()) {
            interpreter.unset(params.nextElement());
        }
    }

    /**
     * Cleans up request variables so that they won't be set in next invocations
     *
     * @param interpreter the beanshell interpreter
     * @param request the request
     *
     */
    public static void cleanup(final Interpreter interpreter, final HttpRequest request) throws EvalError {
        try {
            URI uri = new URI(request.getRequestLine().getUri());
            for (String name : QueryString.parse(uri).getNames()) {
                interpreter.unset(name);
            }
        } catch (URISyntaxException x) {
            //
            // nothing to do
            //
        }
    }

    /**
     * Sets all variables available in the interpreter as request attributes.
     *
     * @param i the interpreter - NOT NULL
     * @param r - the request - NOT NULL
     *
     * @throws EvalError
     */
    public static void setVariablesAttributes(final Interpreter i, final HttpServletRequest r) throws EvalError {
        if (i == null) {
            throw new IllegalArgumentException("i cannot be null");
        }

        if (r == null) {
            throw new IllegalArgumentException("r cannot be null");
        }

        String[] vars = (String[]) i.get("this.variables");
        for (String var : vars) {
            r.setAttribute(var, i.get(var));
        }
    }

    /**
     * Returns true if the request content is supposed to contain a json object
     * as per the specified content type
     * 
     * @param request the request
     * 
     * @return true if the content type is "application/json", false otherwise
     */
    public static boolean hasJSONBody(HttpServletRequest request) {
        String contentType = request.getContentType();
        if (contentType == null) {
            return false;
        }

        return CONTENT_TYPE_JSON.equals(contentType) || contentType.startsWith(CONTENT_TYPE_JSON + ";");
    }
}