Search in sources :

Example 1 with ScriptEvaluationException

use of org.apache.sling.api.scripting.ScriptEvaluationException in project sling by apache.

the class DefaultSlingScript method service.

/**
     * @see javax.servlet.Servlet#service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
     */
public void service(ServletRequest req, ServletResponse res) {
    final SlingHttpServletRequest request = (SlingHttpServletRequest) req;
    try {
        // prepare the properties for the script
        final SlingBindings props = new SlingBindings();
        props.setRequest((SlingHttpServletRequest) req);
        props.setResponse((SlingHttpServletResponse) res);
        // try to set content type (unless included)
        if (request.getAttribute(SlingConstants.ATTR_INCLUDE_SERVLET_PATH) == null) {
            final String contentType = request.getResponseContentType();
            if (contentType != null) {
                res.setContentType(contentType);
                // see SLING-679
                if (contentType.startsWith("text/")) {
                    res.setCharacterEncoding("UTF-8");
                }
            } else {
                LOGGER.debug("service: No response content type defined for request {}.", request.getRequestURI());
            }
        } else {
            LOGGER.debug("service: Included request, not setting content type and encoding");
        }
        // evaluate the script now using the ScriptEngine
        eval(props);
    } catch (ScriptEvaluationException see) {
        // log in the request progress tracker
        logScriptError(request, see);
        throw see;
    } catch (SlingException e) {
        // log in the request progress tracker
        logScriptError(request, e);
        throw e;
    } catch (Exception e) {
        // log in the request progress tracker
        logScriptError(request, e);
        throw new SlingException("Cannot get DefaultSlingScript: " + e.getMessage(), e);
    }
}
Also used : SlingBindings(org.apache.sling.api.scripting.SlingBindings) ScriptEvaluationException(org.apache.sling.api.scripting.ScriptEvaluationException) SlingException(org.apache.sling.api.SlingException) SlingHttpServletRequest(org.apache.sling.api.SlingHttpServletRequest) ScriptException(javax.script.ScriptException) SlingException(org.apache.sling.api.SlingException) ScriptEvaluationException(org.apache.sling.api.scripting.ScriptEvaluationException) IOException(java.io.IOException)

Example 2 with ScriptEvaluationException

use of org.apache.sling.api.scripting.ScriptEvaluationException in project sling by apache.

the class JspServletWrapper method handleJspExceptionInternal.

/**
     * Returns only a ServletException or a SlingException
     */
private Exception handleJspExceptionInternal(final Exception ex) throws ServletException {
    Throwable realException = ex;
    String exMessage = "";
    if (ex instanceof ServletException) {
        realException = ((ServletException) ex).getRootCause();
        // root cause might be null (eg. for a JasperException ex)
        if (realException == null) {
            realException = ex;
        } else {
            exMessage = ex.toString();
        }
    }
    // avoid nested ScriptEvaluationExceptions (eg. in nested jsp includes)
    while (realException instanceof ScriptEvaluationException) {
        realException = realException.getCause();
    }
    try {
        // First identify the stack frame in the trace that represents the JSP
        StackTraceElement[] frames = realException.getStackTrace();
        StackTraceElement jspFrame = null;
        for (int i = 0; i < frames.length; ++i) {
            if (frames[i].getClassName().equals(this.theServlet.getClass().getName())) {
                jspFrame = frames[i];
                break;
            }
        }
        if (jspFrame == null) {
            // to the generated servlet class, we can't really add anything
            if (ex instanceof ServletException) {
                return ex;
            }
            return new SlingException(ex) {
            };
        }
        int javaLineNumber = jspFrame.getLineNumber();
        JavacErrorDetail detail = ErrorDispatcher.createJavacError(jspFrame.getMethodName(), this.ctxt.getCompiler().getPageNodes(), null, javaLineNumber, ctxt);
        // If the line number is less than one we couldn't find out
        // where in the JSP things went wrong
        int jspLineNumber = detail.getJspBeginLineNumber();
        if (jspLineNumber < 1) {
            if (realException instanceof ServletException) {
                return (ServletException) realException;
            }
            return new SlingException(exMessage, realException);
        }
        if (options.getDisplaySourceFragment() && detail.getJspExtract() != null) {
            return new SlingException(Localizer.getMessage("jsp.exception", detail.getJspFileName(), "" + jspLineNumber) + "\n\n" + detail.getJspExtract() + "\n", realException);
        }
        return new SlingException(Localizer.getMessage("jsp.exception", detail.getJspFileName(), "" + jspLineNumber), realException);
    } catch (final Exception je) {
        // If anything goes wrong, just revert to the original behaviour
        if (realException instanceof ServletException) {
            return (ServletException) realException;
        }
        return new SlingException(exMessage, realException);
    }
}
Also used : ServletException(javax.servlet.ServletException) SlingServletException(org.apache.sling.api.SlingServletException) JavacErrorDetail(org.apache.sling.scripting.jsp.jasper.compiler.JavacErrorDetail) ScriptEvaluationException(org.apache.sling.api.scripting.ScriptEvaluationException) SlingException(org.apache.sling.api.SlingException) ServletException(javax.servlet.ServletException) SlingServletException(org.apache.sling.api.SlingServletException) SlingException(org.apache.sling.api.SlingException) IOException(java.io.IOException) SlingIOException(org.apache.sling.api.SlingIOException) UnavailableException(javax.servlet.UnavailableException) ScriptEvaluationException(org.apache.sling.api.scripting.ScriptEvaluationException) SlingPageException(org.apache.sling.scripting.jsp.SlingPageException) JasperException(org.apache.sling.scripting.jsp.jasper.JasperException)

Example 3 with ScriptEvaluationException

use of org.apache.sling.api.scripting.ScriptEvaluationException in project sling by apache.

the class DefaultSlingScript method call.

/**
     * @see org.apache.sling.api.scripting.SlingScript#call(org.apache.sling.api.scripting.SlingBindings, java.lang.String, java.lang.Object[])
     * @throws ScriptEvaluationException
     */
public Object call(SlingBindings props, String method, Object... args) {
    Bindings bindings = null;
    Reader reader = null;
    boolean disposeScriptHelper = !props.containsKey(SLING);
    ResourceResolver oldResolver = null;
    try {
        bindings = verifySlingBindings(props);
        // use final variable for inner class!
        final Bindings b = bindings;
        // create script context
        final ScriptContext ctx = new ScriptContext() {

            private Bindings globalScope;

            private Bindings engineScope = b;

            private Writer writer = (Writer) b.get(OUT);

            private Writer errorWriter = new LogWriter((Logger) b.get(LOG));

            private Reader reader = (Reader) b.get(READER);

            private Bindings slingScope = new SimpleBindings();

            /**
                 * @see javax.script.ScriptContext#setBindings(javax.script.Bindings, int)
                 */
            public void setBindings(final Bindings bindings, final int scope) {
                switch(scope) {
                    case SlingScriptConstants.SLING_SCOPE:
                        this.slingScope = bindings;
                        break;
                    case 100:
                        if (bindings == null)
                            throw new NullPointerException("Bindings for ENGINE scope is null");
                        this.engineScope = bindings;
                        break;
                    case 200:
                        this.globalScope = bindings;
                        break;
                    default:
                        throw new IllegalArgumentException("Invalid scope");
                }
            }

            /**
                 * @see javax.script.ScriptContext#getBindings(int)
                 */
            public Bindings getBindings(final int scope) {
                switch(scope) {
                    case SlingScriptConstants.SLING_SCOPE:
                        return slingScope;
                    case 100:
                        return this.engineScope;
                    case 200:
                        return this.globalScope;
                }
                throw new IllegalArgumentException("Invalid scope");
            }

            /**
                 * @see javax.script.ScriptContext#setAttribute(java.lang.String, java.lang.Object, int)
                 */
            public void setAttribute(final String name, final Object value, final int scope) {
                if (name == null)
                    throw new IllegalArgumentException("Name is null");
                final Bindings bindings = getBindings(scope);
                if (bindings != null) {
                    bindings.put(name, value);
                }
            }

            /**
                 * @see javax.script.ScriptContext#getAttribute(java.lang.String, int)
                 */
            public Object getAttribute(final String name, final int scope) {
                if (name == null)
                    throw new IllegalArgumentException("Name is null");
                final Bindings bindings = getBindings(scope);
                if (bindings != null) {
                    return bindings.get(name);
                }
                return null;
            }

            /**
                 * @see javax.script.ScriptContext#removeAttribute(java.lang.String, int)
                 */
            public Object removeAttribute(final String name, final int scope) {
                if (name == null)
                    throw new IllegalArgumentException("Name is null");
                final Bindings bindings = getBindings(scope);
                if (bindings != null) {
                    return bindings.remove(name);
                }
                return null;
            }

            /**
                 * @see javax.script.ScriptContext#getAttribute(java.lang.String)
                 */
            public Object getAttribute(String name) {
                if (name == null)
                    throw new IllegalArgumentException("Name is null");
                for (final int scope : SCOPES) {
                    final Bindings bindings = getBindings(scope);
                    if (bindings != null) {
                        final Object o = bindings.get(name);
                        if (o != null) {
                            return o;
                        }
                    }
                }
                return null;
            }

            /**
                 * @see javax.script.ScriptContext#getAttributesScope(java.lang.String)
                 */
            public int getAttributesScope(String name) {
                if (name == null)
                    throw new IllegalArgumentException("Name is null");
                for (final int scope : SCOPES) {
                    if ((getBindings(scope) != null) && (getBindings(scope).containsKey(name))) {
                        return scope;
                    }
                }
                return -1;
            }

            /**
                 * @see javax.script.ScriptContext#getScopes()
                 */
            public List<Integer> getScopes() {
                return Arrays.asList(SCOPES);
            }

            /**
                 * @see javax.script.ScriptContext#getWriter()
                 */
            public Writer getWriter() {
                return this.writer;
            }

            /**
                 * @see javax.script.ScriptContext#getErrorWriter()
                 */
            public Writer getErrorWriter() {
                return this.errorWriter;
            }

            /**
                 * @see javax.script.ScriptContext#setWriter(java.io.Writer)
                 */
            public void setWriter(Writer writer) {
                this.writer = writer;
            }

            /**
                 * @see javax.script.ScriptContext#setErrorWriter(java.io.Writer)
                 */
            public void setErrorWriter(Writer writer) {
                this.errorWriter = writer;
            }

            /**
                 * @see javax.script.ScriptContext#getReader()
                 */
            public Reader getReader() {
                return this.reader;
            }

            /**
                 * @see javax.script.ScriptContext#setReader(java.io.Reader)
                 */
            public void setReader(Reader reader) {
                this.reader = reader;
            }
        };
        // set the current resource resolver if a request is available from the bindings
        if (props.getRequest() != null) {
            oldResolver = requestResourceResolver.get();
            requestResourceResolver.set(props.getRequest().getResourceResolver());
        }
        // set the script resource resolver as an attribute
        ctx.setAttribute(SlingScriptConstants.ATTR_SCRIPT_RESOURCE_RESOLVER, this.scriptResource.getResourceResolver(), SlingScriptConstants.SLING_SCOPE);
        reader = getScriptReader();
        if (method != null && !(this.scriptEngine instanceof Invocable)) {
            reader = getWrapperReader(reader, method, args);
        }
        // evaluate the script
        final Object result;
        if (method == null && this.scriptEngine instanceof Compilable) {
            CachedScript cachedScript = scriptCache.getScript(scriptName);
            if (cachedScript == null) {
                ScriptNameAwareReader snReader = new ScriptNameAwareReader(reader, scriptName);
                CompiledScript compiledScript = ((Compilable) scriptEngine).compile(snReader);
                cachedScript = new CachedScriptImpl(scriptName, compiledScript);
                scriptCache.putScript(cachedScript);
                LOGGER.debug("Adding {} to the script cache.", scriptName);
            } else {
                LOGGER.debug("Script {} was already cached.", scriptName);
            }
            result = cachedScript.getCompiledScript().eval(ctx);
        } else {
            result = scriptEngine.eval(reader, ctx);
        }
        // call method - if supplied and script engine supports direct invocation
        if (method != null && (this.scriptEngine instanceof Invocable)) {
            try {
                ((Invocable) scriptEngine).invokeFunction(method, Arrays.asList(args).toArray());
            } catch (NoSuchMethodException e) {
                throw new ScriptEvaluationException(this.scriptName, "Method " + method + " not found in script.", e);
            }
        }
        // optionall flush the output channel
        Object flushObject = bindings.get(FLUSH);
        if (flushObject instanceof Boolean && (Boolean) flushObject) {
            ctx.getWriter().flush();
        }
        // allways flush the error channel
        ctx.getErrorWriter().flush();
        return result;
    } catch (IOException ioe) {
        throw new ScriptEvaluationException(this.scriptName, ioe.getMessage(), ioe);
    } catch (ScriptException se) {
        Throwable cause = (se.getCause() == null) ? se : se.getCause();
        throw new ScriptEvaluationException(this.scriptName, se.getMessage(), cause);
    } finally {
        if (props.getRequest() != null) {
            requestResourceResolver.set(oldResolver);
        }
        // close the script reader (SLING-380)
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException ignore) {
            // don't care
            }
        }
        // dispose of the SlingScriptHelper
        if (bindings != null && disposeScriptHelper) {
            final InternalScriptHelper helper = (InternalScriptHelper) bindings.get(SLING);
            if (helper != null) {
                helper.cleanup();
            }
        }
    }
}
Also used : CompiledScript(javax.script.CompiledScript) ScriptEvaluationException(org.apache.sling.api.scripting.ScriptEvaluationException) CachedScript(org.apache.sling.scripting.api.CachedScript) Reader(java.io.Reader) InputStreamReader(java.io.InputStreamReader) ScriptNameAwareReader(org.apache.sling.scripting.core.ScriptNameAwareReader) StringReader(java.io.StringReader) BufferedReader(java.io.BufferedReader) ScriptContext(javax.script.ScriptContext) Logger(org.slf4j.Logger) SlingBindings(org.apache.sling.api.scripting.SlingBindings) SimpleBindings(javax.script.SimpleBindings) Bindings(javax.script.Bindings) ProtectedBindings(org.apache.sling.scripting.core.impl.helper.ProtectedBindings) Invocable(javax.script.Invocable) ScriptException(javax.script.ScriptException) Compilable(javax.script.Compilable) IOException(java.io.IOException) ScriptNameAwareReader(org.apache.sling.scripting.core.ScriptNameAwareReader) SimpleBindings(javax.script.SimpleBindings) CachedScriptImpl(org.apache.sling.scripting.core.impl.helper.CachedScriptImpl) ResourceResolver(org.apache.sling.api.resource.ResourceResolver) PrintWriter(java.io.PrintWriter) Writer(java.io.Writer)

Aggregations

IOException (java.io.IOException)3 ScriptEvaluationException (org.apache.sling.api.scripting.ScriptEvaluationException)3 ScriptException (javax.script.ScriptException)2 SlingException (org.apache.sling.api.SlingException)2 SlingBindings (org.apache.sling.api.scripting.SlingBindings)2 BufferedReader (java.io.BufferedReader)1 InputStreamReader (java.io.InputStreamReader)1 PrintWriter (java.io.PrintWriter)1 Reader (java.io.Reader)1 StringReader (java.io.StringReader)1 Writer (java.io.Writer)1 Bindings (javax.script.Bindings)1 Compilable (javax.script.Compilable)1 CompiledScript (javax.script.CompiledScript)1 Invocable (javax.script.Invocable)1 ScriptContext (javax.script.ScriptContext)1 SimpleBindings (javax.script.SimpleBindings)1 ServletException (javax.servlet.ServletException)1 UnavailableException (javax.servlet.UnavailableException)1 SlingHttpServletRequest (org.apache.sling.api.SlingHttpServletRequest)1