1 package net.trajano.twiff.internal.servlet;
2
3 import javax.servlet.http.HttpServletRequest;
4 import net.trajano.twiff.ActionResultProcessor;
5 import net.trajano.twiff.Configuration;
6 import net.trajano.twiff.TwiffException;
7 import net.trajano.twiff.internal.webxml.WebXmlAdapter;
8 import net.trajano.twiff.web.ViewServlet;
9 import org.apache.commons.fileupload.FileUploadException;
10 import org.apache.commons.lang.StringUtils;
11
12 /***
13 * Processes action results of strings.
14 *
15 * @author Archimedes Trajano
16 */
17 public class StringActionResultProcessor implements ActionResultProcessor {
18 /***
19 * Constructs the processor.
20 *
21 * @param configuration
22 * the configuration to get the token value.
23 * @param webXmlAdapter
24 * web.xml adapter
25 */
26 public StringActionResultProcessor(final Configuration configuration, final WebXmlAdapter webXmlAdapter) {
27 this.configuration = configuration;
28 this.webXmlAdapter = webXmlAdapter;
29 }
30
31 /***
32 * Web.xml adapter.
33 */
34 private final WebXmlAdapter webXmlAdapter;
35
36 /***
37 * Configuration.
38 */
39 private final Configuration configuration;
40
41 /***
42 * Returns true if the result is a string.
43 *
44 * @see net.trajano.twiff.ActionResultProcessor#isResultProcessable(java.lang.Object,
45 * javax.servlet.http.HttpServletRequest)
46 */
47 public boolean isResultProcessable(final Object result, final HttpServletRequest request) {
48 return result instanceof String;
49 }
50
51 /***
52 * @see net.trajano.twiff.ActionResultProcessor#processActionResult(java.lang.Object,
53 * javax.servlet.http.HttpServletRequest)
54 */
55 public String processActionResult(final Object result, final HttpServletRequest request) {
56 try {
57 ActionServletRequestAdapter requestAdapter = new ActionServletRequestAdapter(request, configuration.getTokenFieldName());
58 StringBuffer newUrl = new StringBuffer(request.getContextPath());
59 String viewServletMapping = webXmlAdapter.getMappingForServlet(ViewServlet.class);
60 if (viewServletMapping.charAt(0) != '/') {
61 newUrl.append('/');
62 }
63 if (request instanceof LocaleHttpServletRequest) {
64 StringBuffer localizedResult = new StringBuffer();
65 localizedResult.append(request.getLocale().toString());
66 localizedResult.append('/');
67 localizedResult.append(result.toString());
68 newUrl.append(StringUtils.replace(viewServletMapping, "*", localizedResult.toString()));
69 } else {
70 newUrl.append(StringUtils.replace(viewServletMapping, "*", result.toString()));
71 }
72 newUrl.append('?');
73 newUrl.append(configuration.getTokenFieldName());
74 newUrl.append('=');
75 newUrl.append(requestAdapter.getTokenId());
76 return newUrl.toString();
77 } catch (FileUploadException e) {
78 throw new TwiffException(e);
79 }
80 }
81 }