1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.commons.chain.web.javax.servlet;
18
19 import javax.servlet.http.HttpServletRequest;
20
21 import org.apache.commons.chain.Catalog;
22 import org.apache.commons.chain.Command;
23 import org.apache.commons.chain.Context;
24 import org.apache.commons.chain.generic.LookupCommand;
25
26 /**
27 * {@link Command} that uses a specified request parameter
28 * to select a {@link Command} from the appropriate {@link Catalog}, and
29 * execute it. To use this command, you would typically map an instance
30 * of {@link ChainProcessor} to a wildcard pattern like "*.execute" and
31 * then arrange that this is the default command to be executed. In such
32 * an environment, a request for the context-relative path
33 * "/foo.execute?command=bar" would cause the "/bar" command to be loaded
34 * and executed.
35 *
36 * @author Craig R. McClanahan
37 */
38 public class RequestParameterMapper extends LookupCommand<ServletWebContext> {
39
40 // ------------------------------------------------------ Instance Variables
41
42 private String catalogKey = ChainProcessor.CATALOG_DEFAULT;
43 private String parameter = "command";
44
45 // ------------------------------------------------------------ Constructors
46
47 /**
48 * The Default-Constructor for this class.
49 */
50 public RequestParameterMapper() {
51 }
52
53 // -------------------------------------------------------------- Properties
54
55 /**
56 * Return the context key under which our {@link Catalog} has been
57 * stored.
58 *
59 * @return The context key for the Catalog.
60 */
61 public String getCatalogKey() {
62 return this.catalogKey;
63 }
64
65 /**
66 * Set the context key under which our {@link Catalog} has been
67 * stored.
68 *
69 * @param catalogKey The new catalog key
70 *
71 * @deprecated Use catalogName to specify the name of the catalog in the
72 * catalog factory
73 */
74 @Deprecated
75 public void setCatalogKey(String catalogKey) {
76 this.catalogKey = catalogKey;
77 }
78
79 /**
80 * Return the name of the request parameter to use for
81 * selecting the {@link Command} to be executed.
82 *
83 * @return The name of the request parameter.
84 *
85 * @deprecated Use catalogName to specify the name of the catalog in the
86 * catalog factory
87 */
88 @Deprecated
89 public String getParameter() {
90 return this.parameter;
91 }
92
93 /**
94 * Set the name of the request parameter to use for
95 * selecting the {@link Command} to be executed.
96 *
97 * @param parameter The new parameter name
98 */
99 public void setParameter(String parameter) {
100 this.parameter = parameter;
101 }
102
103 // --------------------------------------------------------- Command Methods
104
105 /**
106 * Look up the specified request parameter for this request, and use it
107 * to select an appropriate {@link Command} to be executed.
108 *
109 * @param context Context for the current request
110 *
111 * @return The name of the {@link Command} instance
112 *
113 * @since Chain 1.2
114 */
115 @Override
116 protected String getCommandName(ServletWebContext context) {
117 // Look up the specified request parameter for this request
118 HttpServletRequest request = context.getRequest();
119 String value = request.getParameter(getParameter());
120 return value;
121 }
122
123 /**
124 * Return the {@link Catalog} to look up the {@link Command} in.
125 *
126 * @param context {@link Context} for this request
127 *
128 * @return The catalog.
129 *
130 * @throws IllegalArgumentException if no {@link Catalog}
131 * can be found
132 *
133 * @since Chain 1.2
134 */
135 @Override
136 protected Catalog<ServletWebContext> getCatalog(ServletWebContext context) {
137 /* If the object returned from the passed context is not a valid catalog
138 * then we use the super class's catalog extraction logic to pull it
139 * or to error gracefully.
140 */
141 Object testCatalog = context.get(getCatalogKey());
142
143 /* Assume that the underlying implementation is following convention and
144 * returning a catalog with the current context.
145 */
146 @SuppressWarnings("unchecked")
147 Catalog<ServletWebContext> catalog = testCatalog instanceof Catalog
148 ? (Catalog<ServletWebContext>) testCatalog
149 : super.getCatalog(context);
150
151 return catalog;
152 }
153 }