001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.commons.chain.web.servlet;
018    
019    
020    import javax.servlet.http.HttpServletRequest;
021    import org.apache.commons.chain.Catalog;
022    import org.apache.commons.chain.Context;
023    import org.apache.commons.chain.Command;
024    import org.apache.commons.chain.generic.LookupCommand;
025    
026    
027    /**
028     * <p>{@link Command} that uses a specified request parameter
029     * to select a {@link Command} from the appropriate {@link Catalog}, and
030     * execute it.  To use this command, you would typically map an instance
031     * of {@link ChainProcessor} to a wildcard pattern like "*.execute" and
032     * then arrange that this is the default command to be executed.  In such
033     * an environment, a request for the context-relative path
034     * "/foo.execute?command=bar" would cause the "/bar" command to be loaded
035     * and executed.</p>
036     *
037     * @author Craig R. McClanahan
038     */
039    
040    public class RequestParameterMapper extends LookupCommand implements Command {
041    
042    
043        // ------------------------------------------------------ Instance Variables
044    
045    
046        private String catalogKey = ChainProcessor.CATALOG_DEFAULT;
047        private String parameter = "command";
048    
049    
050        // -------------------------------------------------------------- Properties
051    
052    
053        /**
054         * <p>Return the context key under which our {@link Catalog} has been
055         * stored.</p>
056         *
057         * @return The context key for the Catalog.
058         */
059        public String getCatalogKey() {
060    
061            return (this.catalogKey);
062    
063        }
064    
065    
066        /**
067         * <p>Set the context key under which our {@link Catalog} has been
068         * stored.</p>
069         *
070         * @param catalogKey The new catalog key
071         *
072         * @deprecated Use catalogName to specify the name of the catalog in the
073         *  catalog factory
074         */
075        public void setCatalogKey(String catalogKey) {
076    
077            this.catalogKey = catalogKey;
078    
079        }
080    
081    
082        /**
083         * <p>Return the name of the request parameter to use for
084         * selecting the {@link Command} to be executed.</p>
085         *
086         * @return The name of the request parameter.
087         *
088         * @deprecated Use catalogName to specify the name of the catalog in the
089         *  catalog factory
090         */
091        public String getParameter() {
092    
093            return (this.parameter);
094    
095        }
096    
097    
098        /**
099         * <p>Set the name of the request parameter to use for
100         * selecting the {@link Command} to be executed.</p>
101         *
102         * @param parameter The new parameter name
103         */
104        public void setParameter(String parameter) {
105    
106            this.parameter = parameter;
107    
108        }
109    
110    
111        // --------------------------------------------------------- Command Methods
112    
113    
114        /**
115         * <p>Look up the specified request paramater for this request, and use it
116         * to select an appropriate {@link Command} to be executed.
117         *
118         * @param context Context for the current request
119         * @return The name of the {@link Command} instance
120         *
121         * @since Chain 1.2
122         */
123        protected String getCommandName(Context context) {
124    
125            // Look up the specified request parameter for this request
126            ServletWebContext swcontext = (ServletWebContext) context;
127            HttpServletRequest request = swcontext.getRequest();
128            String value = request.getParameter(getParameter());
129            return value;
130    
131        }
132    
133    
134        /**
135         * <p>Return the {@link Catalog} to look up the {@link Command} in.</p>
136         *
137         * @param context {@link Context} for this request
138         * @return The catalog.
139         * @exception IllegalArgumentException if no {@link Catalog}
140         *  can be found
141         *
142         * @since Chain 1.2
143         */
144        protected Catalog getCatalog(Context context) {
145            Catalog catalog = (Catalog) context.get(getCatalogKey());
146            if (catalog == null) {
147                catalog = super.getCatalog(context);
148            }
149            return catalog;
150        }
151    
152    
153    }