001: /*
002: * Copyright 1999-2004 The Apache Software Foundation
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package org.apache.commons.chain.web.servlet;
017:
018: import javax.servlet.http.HttpServletRequest;
019: import org.apache.commons.chain.Catalog;
020: import org.apache.commons.chain.Command;
021: import org.apache.commons.chain.Context;
022:
023: /**
024: * <p>{@link Command} that uses a specified request parameter
025: * to select a {@link Command} from the appropriate {@link Catalog}, and
026: * execute it. To use this command, you would typically map an instance
027: * of {@link ChainProcessor} to a wildcard pattern like "*.execute" and
028: * then arrange that this is the default command to be executed. In such
029: * an environment, a request for the context-relative path
030: * "/foo.execute?command=bar" would cause the "/bar" command to be loaded
031: * and executed.</p>
032: *
033: * @author Craig R. McClanahan
034: */
035:
036: public class RequestParameterMapper implements Command {
037:
038: // ------------------------------------------------------ Instance Variables
039:
040: private String catalogKey = ChainProcessor.CATALOG_DEFAULT;
041: private String parameter = "command";
042:
043: // -------------------------------------------------------------- Properties
044:
045: /**
046: * <p>Return the context key under which our {@link Catalog} has been
047: * stored.</p>
048: *
049: * @return The context key for the Catalog.
050: */
051: public String getCatalogKey() {
052:
053: return (this .catalogKey);
054:
055: }
056:
057: /**
058: * <p>Set the context key under which our {@link Catalog} has been
059: * stored.</p>
060: *
061: * @param catalogKey The new catalog key
062: */
063: public void setCatalogKey(String catalogKey) {
064:
065: this .catalogKey = catalogKey;
066:
067: }
068:
069: /**
070: * <p>Return the name of the request parameter to use for
071: * selecting the {@link Command} to be executed.</p>
072: *
073: * @return The name of the request parameter.
074: */
075: public String getParameter() {
076:
077: return (this .parameter);
078:
079: }
080:
081: /**
082: * <p>Set the name of the request parameter to use for
083: * selecting the {@link Command} to be executed.</p>
084: *
085: * @param parameter The new parameter name
086: */
087: public void setParameter(String parameter) {
088:
089: this .parameter = parameter;
090:
091: }
092:
093: // --------------------------------------------------------- Command Methods
094:
095: /**
096: * <p>Look up the specified request paramater for this request, and use it
097: * to select an appropriate {@link Command} to be executed.
098: *
099: * @param context Context for the current request
100: * @return The result of executing the Command for the request parameter.
101: * @throws Exception if there is a problem executing the Command for
102: * the request parameter.
103: */
104: public boolean execute(Context context) throws Exception {
105:
106: // Look up the specified request parameter for this request
107: ServletWebContext swcontext = (ServletWebContext) context;
108: HttpServletRequest request = swcontext.getRequest();
109: String value = request.getParameter(getParameter());
110:
111: // Map to the Command specified by the extra path info
112: Catalog catalog = (Catalog) context.get(getCatalogKey());
113: Command command = catalog.getCommand(value);
114: return (command.execute(context));
115:
116: }
117:
118: }
|