1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.module.blossom.support;
35
36 import java.io.IOException;
37 import java.util.ArrayList;
38 import java.util.List;
39
40 import javax.servlet.RequestDispatcher;
41 import javax.servlet.ServletException;
42 import javax.servlet.ServletRequest;
43 import javax.servlet.ServletResponse;
44 import javax.servlet.http.HttpServletRequest;
45 import javax.servlet.http.HttpServletRequestWrapper;
46
47 import org.springframework.web.util.WebUtils;
48
49
50
51
52
53
54
55 public class IncludeRequestWrapper extends SpecialAttributeRequestWrapper {
56
57 private static final String INCLUDE_ATTRIBUTES_COMMON_PREFIX = "javax.servlet.include.";
58 private static final String[] INCLUDE_ATTRIBUTE_NAMES = new String[]{
59 WebUtils.INCLUDE_REQUEST_URI_ATTRIBUTE,
60 WebUtils.INCLUDE_CONTEXT_PATH_ATTRIBUTE,
61 WebUtils.INCLUDE_SERVLET_PATH_ATTRIBUTE,
62 WebUtils.INCLUDE_PATH_INFO_ATTRIBUTE,
63 WebUtils.INCLUDE_QUERY_STRING_ATTRIBUTE};
64
65 private final List<Object> previousChainState = new ArrayList<Object>(48);
66
67 public IncludeRequestWrapper(HttpServletRequest request, String requestUri, String contextPath, String servletPath, Object pathInfo, String queryString) {
68 super(request);
69 setOverriddenAttributes(
70 INCLUDE_ATTRIBUTES_COMMON_PREFIX,
71 INCLUDE_ATTRIBUTE_NAMES,
72 new Object[]{
73 requestUri,
74 contextPath,
75 servletPath,
76 pathInfo,
77 queryString}
78 );
79
80
81 ServletRequest wrapper = request;
82 while (wrapper instanceof HttpServletRequestWrapper) {
83 if (wrapper instanceof IncludeRequestWrapper) {
84 IncludeRequestWrapper includeRequestWrapper = (IncludeRequestWrapper) wrapper;
85 previousChainState.add(includeRequestWrapper);
86 previousChainState.add(includeRequestWrapper.isEnabled());
87 includeRequestWrapper.setEnabled(false);
88 }
89 wrapper = ((HttpServletRequestWrapper) wrapper).getRequest();
90 }
91 }
92
93 public void restore() {
94 for (int i = 0; i < previousChainState.size(); ) {
95 IncludeRequestWrapper includeRequestWrapper = (IncludeRequestWrapper) previousChainState.get(i++);
96 includeRequestWrapper.setEnabled((Boolean) previousChainState.get(i++));
97 }
98 }
99
100 @Override
101 public RequestDispatcher getRequestDispatcher(final String path) {
102
103 if (!isEnabled()) {
104 return super.getRequestDispatcher(path);
105 }
106
107 final RequestDispatcher dispatcher = super.getRequestDispatcher(path);
108
109 return new RequestDispatcher() {
110
111 @Override
112 public void forward(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
113 boolean previousValue = isEnabled();
114 setEnabled(false);
115 try {
116 dispatcher.forward(servletRequest, servletResponse);
117 } finally {
118 setEnabled(previousValue);
119 }
120 }
121
122 @Override
123 public void include(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
124 boolean previousValue = isEnabled();
125 setEnabled(false);
126 try {
127 dispatcher.include(servletRequest, servletResponse);
128 } finally {
129 setEnabled(previousValue);
130 }
131 }
132 };
133 }
134 }