1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.myfaces.orchestra.requestParameterProvider;
21
22 import org.apache.commons.logging.Log;
23 import org.apache.commons.logging.LogFactory;
24 import org.apache.myfaces.orchestra.frameworkAdapter.FrameworkAdapter;
25
26 import java.io.Serializable;
27 import java.util.ArrayList;
28 import java.util.HashSet;
29 import java.util.Iterator;
30 import java.util.List;
31 import java.util.Set;
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 public class RequestParameterProviderManager implements Serializable
51 {
52 private final Log LOG = LogFactory.getLog(RequestParameterProviderManager.class);
53
54 private static final String PAGE_LINK_SEP = "#";
55
56 private static final Set SCHEMES_TO_EXCLUDE = new HashSet();
57
58 private static final String PAGE_PARAMETER_SEP = "?";
59 private static final String PARAMETER_SEP = "&";
60 private static final String PARAMETER_PROVIDER_MANAGER_KEY = RequestParameterProviderManager.class.getName();
61
62
63
64
65
66 private transient List providers;
67
68 static
69 {
70 SCHEMES_TO_EXCLUDE.add("javascript");
71 SCHEMES_TO_EXCLUDE.add("ftp");
72 SCHEMES_TO_EXCLUDE.add("mailto");
73 }
74
75 private RequestParameterProviderManager()
76 {
77 }
78
79 public static RequestParameterProviderManager getInstance()
80 {
81 RequestParameterProviderManager manager =
82 (RequestParameterProviderManager) FrameworkAdapter.getCurrentInstance()
83 .getSessionAttribute(PARAMETER_PROVIDER_MANAGER_KEY);
84
85 if (manager == null)
86 {
87
88 manager = new RequestParameterProviderManager();
89 FrameworkAdapter.getCurrentInstance().setSessionAttribute(PARAMETER_PROVIDER_MANAGER_KEY, manager);
90 }
91
92 return manager;
93 }
94
95
96
97
98
99
100
101
102 public void register(RequestParameterProvider provider)
103 {
104 if (provider == null)
105 {
106 LOG.warn("RequestParameterProvider is null -> no registration!");
107 }
108 else
109 {
110 getProviders().add(provider);
111 }
112 }
113
114
115
116
117
118
119
120
121
122 public String encodeAndAttachParameters(String url)
123 {
124 if (!isResponseIntercepted())
125 {
126 throw new IllegalStateException(
127 "RequestParameterServletFilter not called. Please configure the filter " +
128 RequestParameterServletFilter.class.getName() +
129 " in your web.xml to cover your faces requests.");
130 }
131
132 if (url == null)
133 {
134 return null;
135 }
136
137 if (PAGE_LINK_SEP.equals(url))
138 {
139
140 return url;
141 }
142
143 int pos = url.indexOf(":");
144 if (pos > 0)
145 {
146 String probablyScheme = url.substring(0, pos);
147 if (SCHEMES_TO_EXCLUDE.contains(probablyScheme))
148 {
149
150 return url;
151 }
152 }
153
154 StringBuffer sb = new StringBuffer();
155
156 int nuofParams = -1;
157 String firstSeparator = url.indexOf(PAGE_PARAMETER_SEP) == -1 ? PAGE_PARAMETER_SEP : PARAMETER_SEP;
158 int pageLinkPos = url.indexOf(PAGE_LINK_SEP);
159 if (pageLinkPos < 0)
160 {
161 sb.append(url);
162 }
163 else
164 {
165 sb.append(url.substring(0, pageLinkPos));
166 }
167
168 for (Iterator it = getProviders().iterator(); it.hasNext();)
169 {
170 RequestParameterProvider provider = (RequestParameterProvider) it.next();
171 String[] fields = provider.getFields();
172 if (fields == null)
173 {
174 continue;
175 }
176 for (int i = 0; i < fields.length; i++)
177 {
178 nuofParams++;
179
180 sb.append(nuofParams == 0 ? firstSeparator : PARAMETER_SEP);
181 sb.append(fields[i]);
182 sb.append("=");
183 sb.append(provider.getFieldValue(fields[i]));
184 }
185 }
186
187 if (pageLinkPos > -1)
188 {
189 sb.append(url.substring(pageLinkPos));
190 }
191 return sb.toString();
192 }
193
194 protected boolean isResponseIntercepted()
195 {
196 FrameworkAdapter fa = FrameworkAdapter.getCurrentInstance();
197
198 return Boolean.TRUE.equals(
199 fa.getRequestAttribute(RequestParameterServletFilter.REQUEST_PARAM_FILTER_CALLED))
200 || Boolean.TRUE.equals(
201 fa.getRequestAttribute(RequestParameterServletFilter.REQUEST_PARAM_RESPONSE_WRAPPED));
202 }
203
204 protected List getProviders()
205 {
206 if (providers == null)
207 {
208 providers = new ArrayList();
209 }
210
211 return providers;
212 }
213 }