001
014
015 package com.liferay.portal.kernel.portlet;
016
017 import com.liferay.portal.kernel.log.Log;
018 import com.liferay.portal.kernel.log.LogFactoryUtil;
019 import com.liferay.portal.kernel.util.StringPool;
020 import com.liferay.portal.kernel.util.Validator;
021 import com.liferay.portal.model.PortletConstants;
022 import com.liferay.portal.util.PortalUtil;
023
024 import java.util.HashMap;
025 import java.util.LinkedHashMap;
026 import java.util.LinkedHashSet;
027 import java.util.Map;
028 import java.util.Set;
029
030 import javax.portlet.PortletMode;
031 import javax.portlet.WindowState;
032
033
052 public class DefaultFriendlyURLMapper extends BaseFriendlyURLMapper {
053
054 public DefaultFriendlyURLMapper() {
055 defaultIgnoredParameters = new LinkedHashSet<String>();
056
057 defaultIgnoredParameters.add("p_p_id");
058 defaultIgnoredParameters.add("p_p_col_id");
059 defaultIgnoredParameters.add("p_p_col_pos");
060 defaultIgnoredParameters.add("p_p_col_count");
061
062 defaultReservedParameters = new LinkedHashMap<String, String>();
063
064 defaultReservedParameters.put("p_p_lifecycle", "0");
065 defaultReservedParameters.put(
066 "p_p_state", WindowState.NORMAL.toString());
067 defaultReservedParameters.put("p_p_mode", PortletMode.VIEW.toString());
068 }
069
070
079 public void addDefaultIgnoredParameter(String name) {
080 defaultIgnoredParameters.add(name);
081 }
082
083
094 public void addDefaultReservedParameter(String name, String value) {
095 defaultReservedParameters.put(name, value);
096 }
097
098 @Override
099 public String buildPath(LiferayPortletURL liferayPortletURL) {
100 Map<String, String> routeParameters = new HashMap<String, String>();
101
102 buildRouteParameters(liferayPortletURL, routeParameters);
103
104 String friendlyURLPath = router.parametersToUrl(routeParameters);
105
106 if (Validator.isNull(friendlyURLPath)) {
107 return null;
108 }
109
110 addParametersIncludedInPath(liferayPortletURL, routeParameters);
111
112 friendlyURLPath = StringPool.SLASH.concat(getMapping()).concat(
113 friendlyURLPath);
114
115 return friendlyURLPath;
116 }
117
118
124 public Set<String> getDefaultIgnoredParameters() {
125 return defaultIgnoredParameters;
126 }
127
128
134 public Map<String, String> getDefaultReservedParameters() {
135 return defaultReservedParameters;
136 }
137
138 @Override
139 public void populateParams(
140 String friendlyURLPath, Map<String, String[]> parameterMap,
141 Map<String, Object> requestContext) {
142
143 friendlyURLPath = friendlyURLPath.substring(getMapping().length() + 1);
144
145 if (friendlyURLPath.endsWith(StringPool.SLASH)) {
146 friendlyURLPath = friendlyURLPath.substring(
147 0, friendlyURLPath.length() - 1);
148 }
149
150 Map<String, String> routeParameters = new HashMap<String, String>();
151
152 if (!router.urlToParameters(friendlyURLPath, routeParameters)) {
153 if (_log.isWarnEnabled()) {
154 _log.warn(
155 "No route could be found to match URL " + friendlyURLPath);
156 }
157
158 return;
159 }
160
161 String portletId = getPortletId(routeParameters);
162
163 if (Validator.isNull(portletId)) {
164 return;
165 }
166
167 String namespace = PortalUtil.getPortletNamespace(portletId);
168
169 addParameter(namespace, parameterMap, "p_p_id", portletId);
170
171 populateParams(parameterMap, namespace, routeParameters);
172 }
173
174
190 protected void addParametersIncludedInPath(
191 LiferayPortletURL liferayPortletURL,
192 Map<String, String> routeParameters) {
193
194
195
196 for (String name : defaultIgnoredParameters) {
197 liferayPortletURL.addParameterIncludedInPath(name);
198 }
199
200
201
202 Map<String, String[]> portletURLParameters =
203 liferayPortletURL.getParameterMap();
204
205 for (String name : portletURLParameters.keySet()) {
206 if (!routeParameters.containsKey(name)) {
207 liferayPortletURL.addParameterIncludedInPath(name);
208 }
209 }
210
211
212
213 Map<String, String> reservedParameters =
214 liferayPortletURL.getReservedParameterMap();
215
216 for (Map.Entry<String, String> entry : reservedParameters.entrySet()) {
217 String key = entry.getKey();
218 String value = entry.getValue();
219
220 if (!routeParameters.containsKey(key) ||
221 value.equals(defaultReservedParameters.get(key))) {
222
223 liferayPortletURL.addParameterIncludedInPath(key);
224 }
225 }
226 }
227
228
242 protected void buildRouteParameters(
243 LiferayPortletURL liferayPortletURL,
244 Map<String, String> routeParameters) {
245
246
247
248 Map<String, String[]> portletURLParameters =
249 liferayPortletURL.getParameterMap();
250
251 for (Map.Entry<String, String[]> entry :
252 portletURLParameters.entrySet()) {
253
254 String[] values = entry.getValue();
255
256 if (values.length > 0) {
257 routeParameters.put(entry.getKey(), values[0]);
258 }
259 }
260
261
262
263 if (isPortletInstanceable()) {
264 String portletId = liferayPortletURL.getPortletId();
265
266 routeParameters.put("p_p_id", portletId);
267
268 if (Validator.isNotNull(portletId) &&
269 PortletConstants.hasInstanceId(portletId)) {
270
271 routeParameters.put(
272 "instanceId", PortletConstants.getInstanceId(portletId));
273 }
274 }
275
276
277
278 routeParameters.putAll(liferayPortletURL.getReservedParameterMap());
279 }
280
281
291 protected String getPortletId(Map<String, String> routeParameters) {
292 if (!isPortletInstanceable()) {
293 return getPortletId();
294 }
295
296 String portletId = routeParameters.remove("p_p_id");
297
298 if (Validator.isNotNull(portletId)) {
299 return portletId;
300 }
301
302 String instanceId = routeParameters.remove("instanceId");
303
304 if (Validator.isNull(instanceId)) {
305 if (_log.isErrorEnabled()) {
306 _log.error(
307 "Either p_p_id or instanceId must be provided for an " +
308 "instanceable portlet");
309 }
310
311 return null;
312 }
313
314 return PortletConstants.assemblePortletId(getPortletId(), instanceId);
315 }
316
317
328 protected void populateParams(
329 Map<String, String[]> parameterMap, String namespace,
330 Map<String, String> routeParameters) {
331
332
333
334 for (Map.Entry<String, String> entry : routeParameters.entrySet()) {
335 addParameter(
336 namespace, parameterMap, entry.getKey(), entry.getValue());
337 }
338
339
340
341 for (Map.Entry<String, String> entry :
342 defaultReservedParameters.entrySet()) {
343
344 String key = entry.getKey();
345
346 if (!parameterMap.containsKey(key)) {
347 addParameter(namespace, parameterMap, key, entry.getValue());
348 }
349 }
350 }
351
352 protected Set<String> defaultIgnoredParameters;
353 protected Map<String, String> defaultReservedParameters;
354
355 private static Log _log = LogFactoryUtil.getLog(
356 DefaultFriendlyURLMapper.class);
357
358 }