1 /*
2 * $Id$
3 *
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements. See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership. The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License. You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied. See the License for the
18 * specific language governing permissions and limitations
19 * under the License.
20 */
21 package org.apache.struts.action;
22
23 import java.util.Arrays;
24
25 import org.apache.struts.config.ActionConfig;
26 import org.apache.struts.config.ControllerConfig;
27 import org.apache.struts.config.ForwardConfig;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 /**
32 * <p>An <strong>ActionMapping</strong> represents the information that the
33 * controller, <code>RequestProcessor</code>, knows about the mapping of a
34 * particular request to an instance of a particular <code>Action</code>
35 * class. The <code>ActionMapping</code> instance used to select a particular
36 * <code>Action</code> is passed on to that <code>Action</code>, thereby
37 * providing access to any custom configuration information included with the
38 * <code>ActionMapping</code> object.</p>
39 *
40 * <p>Since Struts 1.1 this class extends <code>ActionConfig</code>.
41 *
42 * <p><strong>NOTE</strong> - This class would have been deprecated and
43 * replaced by <code>org.apache.struts.config.ActionConfig</code> except for
44 * the fact that it is part of the public API that existing applications are
45 * using.</p>
46 *
47 * @version $Rev$ $Date: 2005-08-26 21:58:39 -0400 (Fri, 26 Aug 2005)
48 * $
49 */
50 public class ActionMapping extends ActionConfig {
51 private static final long serialVersionUID = 2801090844264312287L;
52
53 /**
54 * The {@code Log} instance for this class.
55 *
56 * @since Struts 1.2.8
57 */
58 private transient final Logger log =
59 LoggerFactory.getLogger(ActionMapping.class);
60
61 /**
62 * <p>Find and return the <code>ForwardConfig</code> instance defining how
63 * forwarding to the specified logical name should be handled. This is
64 * performed by checking local and then global configurations for the
65 * specified forwarding configuration. If no forwarding configuration can
66 * be found, return <code>null</code>.</p>
67 *
68 * @param forwardName Logical name of the forwarding instance to be
69 * returned
70 * @return The local or global forward with the specified name.
71 * @see #findRequiredForward(String)
72 */
73 public ActionForward findForward(String forwardName) {
74 ForwardConfig config = findForwardConfig(forwardName);
75
76 if (config == null) {
77 config = getModuleConfig().findForwardConfig(forwardName);
78 }
79
80 // TODO: remove warning since findRequiredForward takes care of use case?
81 if (config == null) {
82 log.warn("Unable to find '{}' forward.", forwardName);
83 }
84
85 return ((ActionForward) config);
86 }
87
88 /**
89 * <p>Find and return the <code>ForwardConfig</code> instance of this
90 * mapping, throwing an exception if not found locally or globally.</p>
91 *
92 * @param forwardName Logical name of the forwarding instance to be
93 * returned
94 * @return The local or global forward with the specified name.
95 * @throws IllegalStateException if the forward is not found
96 * @see #findForward(String)
97 * @since Struts 1.4
98 */
99 public ActionForward findRequiredForward(String forwardName) {
100 ActionForward forward = findForward(forwardName);
101 if (forward == null) {
102 throw new IllegalStateException(
103 "Unable to find '" + forwardName +
104 "' forward of action path '" + getPath() + "'");
105 }
106 return forward;
107 }
108
109 /**
110 * <p>Return the logical names of all locally defined forwards for this
111 * mapping. If there are no such forwards, a zero-length array is
112 * returned.</p>
113 *
114 * @return The forward names for this action mapping.
115 */
116 public String[] findForwards() {
117 ForwardConfig[] fcs = findForwardConfigs();
118 String[] results = new String[fcs.length];
119
120 Arrays.setAll(results, i -> fcs[i].getName());
121
122 return results;
123 }
124
125 /**
126 * <p>Create (if necessary) and return an {@link ActionForward} that
127 * corresponds to the <code>input</code> property of this Action.
128 * <p>
129 * <b>Since Struts 1.4: </b>
130 * If the <code>input</code> property is not specified and the Controller
131 * is configured to interpret the property as a forward, return the
132 * forward named "input" (if it exists) in this action mapping.</p>
133 *
134 * @return The input forward for this action mapping.
135 * @see ControllerConfig#getInputForward()
136 * @since Struts 1.1
137 */
138 public ActionForward getInputForward() {
139 String input = getInput();
140 if (getModuleConfig().getControllerConfig().getInputForward()) {
141 if (input != null) {
142 return findForward(input);
143 }
144 return findForward(Action.INPUT);
145 }
146 return (new ActionForward(input));
147 }
148 }