/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.jasper.compiler;

import jakarta.servlet.ServletContext;

import org.apache.jasper.JspCompilationContext;

/**
 * Provides {@link ELInterpreter} instances for JSP compilation. The search order is as follows:
 * <ol>
 * <li>ELInterpreter instance or implementation class name provided as a ServletContext attribute</li>
 * <li>Implementation class named in a ServletContext initialisation parameter</li>
 * <li>Default implementation</li>
 * </ol>
 */
public class ELInterpreterFactory {

    /**
     * The name of the EL interpreter class used as a ServletContext attribute and init parameter key.
     */
    public static final String EL_INTERPRETER_CLASS_NAME = ELInterpreter.class.getName();

    private static final ELInterpreter DEFAULT_INSTANCE = new DefaultELInterpreter();


    /**
     * Obtain the correct EL Interpreter for the given web application.
     *
     * @param context The Servlet context
     *
     * @return the EL interpreter
     *
     * @throws Exception If an error occurs creating the interpreter
     */
    public static ELInterpreter getELInterpreter(ServletContext context) throws Exception {

        ELInterpreter result = null;

        // Search for an implementation
        // 1. ServletContext attribute (set by application or cached by a previous call to this method).
        Object attribute = context.getAttribute(EL_INTERPRETER_CLASS_NAME);
        if (attribute instanceof ELInterpreter) {
            return (ELInterpreter) attribute;
        } else if (attribute instanceof String) {
            result = createInstance(context, (String) attribute);
        }

        // 2. ServletContext init parameter
        if (result == null) {
            String className = context.getInitParameter(EL_INTERPRETER_CLASS_NAME);
            if (className != null) {
                result = createInstance(context, className);
            }
        }

        // 3. Default
        if (result == null) {
            result = DEFAULT_INSTANCE;
        }

        // Cache the result for next time
        context.setAttribute(EL_INTERPRETER_CLASS_NAME, result);
        return result;
    }


    private static ELInterpreter createInstance(ServletContext context, String className) throws Exception {
        return (ELInterpreter) context.getClassLoader().loadClass(className).getConstructor().newInstance();
    }


    private ELInterpreterFactory() {
        // Utility class. Hide default constructor.
    }


    /**
     * Default implementation of {@link ELInterpreter} that delegates to {@link JspUtil#interpreterCall}.
     */
    public static class DefaultELInterpreter implements ELInterpreter {

        /**
         * Creates a new DefaultELInterpreter instance.
         */
        public DefaultELInterpreter() {
        }

        @Override
        public String interpreterCall(JspCompilationContext context, boolean isTagFile, String expression,
                Class<?> expectedType, String fnmapvar) {
            return JspUtil.interpreterCall(isTagFile, expression, expectedType, fnmapvar);
        }
    }
}
