1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 package org.mwolff.struts.back;
24
25 import java.io.IOException;
26
27 import javax.servlet.ServletException;
28 import javax.servlet.http.HttpServletRequest;
29 import javax.servlet.http.HttpServletResponse;
30
31 import org.apache.commons.logging.Log;
32 import org.apache.commons.logging.LogFactory;
33 import org.apache.struts.action.Action;
34 import org.apache.struts.action.ActionForm;
35 import org.apache.struts.action.ActionForward;
36 import org.apache.struts.action.ActionMapping;
37 import org.apache.struts.action.ActionServlet;
38 import org.apache.struts.config.ModuleConfig;
39 import org.apache.struts.tiles.TilesRequestProcessor;
40
41 /***
42 * Special RequestProcessor to process back and forward mechanism.
43 *
44 * @author mwolff
45 */
46 public class BackRequestProcessor extends TilesRequestProcessor {
47
48 /***
49 * <p>
50 * Commons Logging instance.
51 * </p>
52 */
53 protected static Log log = LogFactory.getLog(BackRequestProcessor.class);
54
55 /***
56 * <p>
57 * Initialize this request processor instance.
58 * </p>
59 *
60 * @param servlet The ActionServlet we are associated with
61 * @param moduleConfig The ModuleConfig we are associated with.
62 * @throws ServletException If an error occor during initialization
63 */
64 public void init(ActionServlet servlet, ModuleConfig moduleConfig)
65 throws ServletException {
66
67 super.init(servlet, moduleConfig);
68 }
69
70 public void setMarker(RingBuffer buffer, HttpServletRequest request) {
71 if (buffer.isForwardPossible()) {
72 request.setAttribute("org.mwolff.struts.isForward", "true");
73 } else {
74 request.setAttribute("org.mwolff.struts.isForward", "false");
75 }
76
77 if (buffer.isBackPossible()) {
78 request.setAttribute("org.mwolff.struts.isBack", "true");
79 } else {
80 request.setAttribute("org.mwolff.struts.isBack", "false");
81 }
82
83 }
84
85 /***
86 * <p>
87 * Ask the specified <code>Action</code> instance to handle this request.
88 * Return the <code>ActionForward</code> instance (if any) returned by the
89 * called <code>Action</code> for further processing.
90 * </p>
91 *
92 * @param request The servlet request we are processing
93 * @param response The servlet response we are creating
94 * @param action The Action instance to be used
95 * @param form The ActionForm instance to pass to this Action
96 * @param mapping The ActionMapping instance to pass to this Action
97 *
98 * @return The <code>ActionForward</code> instance (if any) returned by
99 * the called <code>Action</code>.
100 *
101 * @exception IOException if an input/output error occurs
102 * @exception ServletException if a servlet exception occurs
103 */
104 protected ActionForward processActionPerform(HttpServletRequest request,
105 HttpServletResponse response, Action action, ActionForm form,
106 ActionMapping mapping) throws IOException, ServletException {
107
108 try {
109 ActionForward forward = (action.execute(mapping, form, request,
110 response));
111
112
113 RingBuffer buffer = (RingBuffer) request.getSession().getAttribute(
114 "org.mwolff.struts.back.RingBuffer");
115
116 if (buffer == null) {
117 buffer = new RingBuffer(100);
118 request.getSession().setAttribute(
119 "org.mwolff.struts.back.RingBuffer", buffer);
120 }
121
122 buffer.print();
123 String query = calculateQueryString(request);
124
125
126 if (query != null && query.indexOf(".do") != -1) {
127
128 if (buffer.isNoPush() == true) {
129
130 buffer.setNoPush(false);
131 setMarker(buffer, request);
132 return forward;
133 }
134 if (buffer.isWereInvolved() == true) {
135
136 buffer.setWereInvolved(false);
137 setMarker(buffer, request);
138 return forward;
139 }
140 ArrayEntry entry = new ArrayEntry(query);
141 buffer.push(entry);
142 setMarker(buffer, request);
143 }
144
145 return forward;
146
147 } catch (Exception e) {
148 return (processException(request, response, e, form, mapping));
149 }
150
151 }
152
153 /***
154 * Calculate the query String out of the Reqeust.
155 *
156 * @param request The actually request
157 * @return The calculated string.
158 */
159 private String calculateQueryString(HttpServletRequest request) {
160
161 String sourceURL = null;
162
163
164
165 StringBuffer url = javax.servlet.http.HttpUtils.getRequestURL(request);
166
167 String queryString = request.getQueryString();
168 if ((queryString != null) && (queryString.length() > 0)) {
169 url.append("?");
170 url.append(queryString);
171 }
172 sourceURL = url.toString();
173 return sourceURL;
174 }
175 }