/*
 * 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.commons.chain2.web.servlet;

import org.apache.commons.chain2.Catalog;
import org.apache.commons.chain2.Command;
import org.apache.commons.chain2.Context;
import org.apache.commons.chain2.base.LookupCommand;

import javax.servlet.http.HttpServletRequest;

/**
 * <p>{@link Command} that uses a specified request parameter
 * to select a {@link Command} from the appropriate {@link Catalog}, and
 * execute it.  To use this command, you would typically map an instance
 * of {@link ChainProcessor} to a wildcard pattern like "*.execute" and
 * then arrange that this is the default command to be executed.  In such
 * an environment, a request for the context-relative path
 * "/foo.execute?command=bar" would cause the "/bar" command to be loaded
 * and executed.</p>
 *
 * @version $Id$
 */
public class RequestParameterMapper
        extends LookupCommand<String, Object, ServletWebContext<String, Object>> {

    // ------------------------------------------------------ Instance Variables

    private String catalogKey = ChainProcessor.CATALOG_DEFAULT;

    private String parameter = "command";

    // -------------------------------------------------------------- Properties

    /**
     * <p>Return the context key under which our {@link Catalog} has been
     * stored.</p>
     *
     * @return The context key for the Catalog.
     */
    public String getCatalogKey() {
        return (this.catalogKey);
    }

    /**
     * <p>Set the name of the request parameter to use for
     * selecting the {@link Command} to be executed.</p>
     *
     * @param parameter The new parameter name
     */
    public void setParameter(String parameter) {
        this.parameter = parameter;
    }

    // --------------------------------------------------------- Command Methods

    /**
     * <p>Look up the specified request parameter for this request, and use it
     * to select an appropriate {@link Command} to be executed.
     *
     * @param context Context for the current request
     * @return The name of the {@link Command} instance
     *
     * @since Chain 1.2
     */
    @Override
    protected String getCommandName(ServletWebContext context) {
        // Look up the specified request parameter for this request
        HttpServletRequest request = context.getRequest();
        String value = request.getParameter(getCatalogName());
        return value;
    }

    /**
     * <p>Return the {@link Catalog} to look up the {@link Command} in.</p>
     *
     * @param context {@link Context} for this request
     * @return The catalog.
     * @throws IllegalArgumentException if no {@link Catalog}
     *  can be found
     *
     * @since Chain 1.2
     */
    @Override
    protected Catalog<String, Object, ServletWebContext<String, Object>>
            getCatalog(ServletWebContext<String, Object> context) {
        /* Assume that the returned value will be null or of a valid catalog
         * type according to chain's historical contract. */
        @SuppressWarnings("unchecked")
        Catalog<String, Object, ServletWebContext<String, Object>> catalog =
                (Catalog<String, Object, ServletWebContext<String, Object>>) context.get(getCatalogKey());

        if (catalog == null) {
            catalog = super.getCatalog(context);
        }

        return catalog;
    }

}
