/*
 * 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.optimizations;

import org.apache.jasper.compiler.Localizer;
import org.apache.jasper.compiler.StringInterpreterFactory.DefaultStringInterpreter;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;

/**
 * Provides an optimised conversion of string values to Enums. It bypasses the check for registered PropertyEditor.
 */
public class StringInterpreterEnum extends DefaultStringInterpreter {

    /**
     * Constructs a new StringInterpreterEnum.
     */
    public StringInterpreterEnum() {
    }

    // Can't be static
    private final Log log = LogFactory.getLog(StringInterpreterEnum.class);

    @Override
    protected String coerceToOtherType(Class<?> c, String s, boolean isNamedAttribute) {
        if (c.isEnum() && !isNamedAttribute) {
            try {
                @SuppressWarnings({ "unchecked", "rawtypes" })
                Enum<?> enumValue = Enum.valueOf((Class<? extends Enum>) c, s);
                return c.getName() + "." + enumValue.name();
            } catch (IllegalArgumentException iae) {
                if (log.isDebugEnabled()) {
                    log.debug(Localizer.getMessage("jsp.error.typeConversion", s, "Enum[" + c.getName() + "]"), iae);
                }
                // Continue and resolve the value at runtime
            }
        }

        return null;
    }
}
