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.model.PortletConstants;
020 import com.liferay.portal.kernel.model.PortletInstance;
021 import com.liferay.portal.kernel.util.PortalUtil;
022 import com.liferay.portal.kernel.util.StringPool;
023 import com.liferay.portal.kernel.util.Validator;
024
025 import java.util.HashMap;
026 import java.util.LinkedHashMap;
027 import java.util.LinkedHashSet;
028 import java.util.Map;
029 import java.util.Set;
030
031 import javax.portlet.PortletMode;
032 import javax.portlet.WindowState;
033
034
051 public class DefaultFriendlyURLMapper extends BaseFriendlyURLMapper {
052
053 public DefaultFriendlyURLMapper() {
054 defaultIgnoredParameters = new LinkedHashSet<>();
055
056 defaultIgnoredParameters.add("p_p_id");
057 defaultIgnoredParameters.add("p_p_col_id");
058 defaultIgnoredParameters.add("p_p_col_pos");
059 defaultIgnoredParameters.add("p_p_col_count");
060
061 defaultReservedParameters = new LinkedHashMap<>();
062
063 defaultReservedParameters.put("p_p_lifecycle", "0");
064 defaultReservedParameters.put(
065 "p_p_state", WindowState.NORMAL.toString());
066 defaultReservedParameters.put("p_p_mode", PortletMode.VIEW.toString());
067 }
068
069
078 public void addDefaultIgnoredParameter(String name) {
079 defaultIgnoredParameters.add(name);
080 }
081
082
093 public void addDefaultReservedParameter(String name, String value) {
094 defaultReservedParameters.put(name, value);
095 }
096
097 @Override
098 public String buildPath(LiferayPortletURL liferayPortletURL) {
099 Map<String, String> routeParameters = new HashMap<>();
100
101 buildRouteParameters(liferayPortletURL, routeParameters);
102
103 String friendlyURLPath = router.parametersToUrl(routeParameters);
104
105 if (Validator.isNull(friendlyURLPath)) {
106 return null;
107 }
108
109 addParametersIncludedInPath(liferayPortletURL, routeParameters);
110
111 friendlyURLPath = StringPool.SLASH.concat(getMapping()).concat(
112 friendlyURLPath);
113
114 return friendlyURLPath;
115 }
116
117
123 public Set<String> getDefaultIgnoredParameters() {
124 return defaultIgnoredParameters;
125 }
126
127
133 public Map<String, String> getDefaultReservedParameters() {
134 return defaultReservedParameters;
135 }
136
137 @Override
138 public void populateParams(
139 String friendlyURLPath, Map<String, String[]> parameterMap,
140 Map<String, Object> requestContext) {
141
142 friendlyURLPath = friendlyURLPath.substring(getMapping().length() + 1);
143
144 if (friendlyURLPath.endsWith(StringPool.SLASH)) {
145 friendlyURLPath = friendlyURLPath.substring(
146 0, friendlyURLPath.length() - 1);
147 }
148
149 Map<String, String> routeParameters = new HashMap<>();
150
151 if (!router.urlToParameters(friendlyURLPath, routeParameters)) {
152 if (_log.isWarnEnabled()) {
153 _log.warn(
154 "No route could be found to match URL " + friendlyURLPath);
155 }
156
157 return;
158 }
159
160 String namespace = null;
161
162 String portletInstanceKey = getPortletId(routeParameters);
163
164 if (Validator.isNotNull(portletInstanceKey)) {
165 namespace = PortalUtil.getPortletNamespace(portletInstanceKey);
166
167 addParameter(namespace, parameterMap, "p_p_id", portletInstanceKey);
168 }
169 else if (isAllPublicRenderParameters(routeParameters)) {
170
171
172
173
174 addParameter(null, parameterMap, "p_p_id", getPortletId());
175 }
176 else {
177 return;
178 }
179
180 populateParams(parameterMap, namespace, routeParameters);
181 }
182
183
199 protected void addParametersIncludedInPath(
200 LiferayPortletURL liferayPortletURL,
201 Map<String, String> routeParameters) {
202
203
204
205 for (String name : defaultIgnoredParameters) {
206 liferayPortletURL.addParameterIncludedInPath(name);
207 }
208
209
210
211 Map<String, String[]> portletURLParameters =
212 liferayPortletURL.getParameterMap();
213
214 for (String name : portletURLParameters.keySet()) {
215 if (!routeParameters.containsKey(name)) {
216 liferayPortletURL.addParameterIncludedInPath(name);
217 }
218 }
219
220
221
222 Map<String, String> reservedParameters =
223 liferayPortletURL.getReservedParameterMap();
224
225 for (Map.Entry<String, String> entry : reservedParameters.entrySet()) {
226 String key = entry.getKey();
227 String value = entry.getValue();
228
229 if (!routeParameters.containsKey(key) ||
230 value.equals(defaultReservedParameters.get(key))) {
231
232 liferayPortletURL.addParameterIncludedInPath(key);
233 }
234 }
235 }
236
237
251 protected void buildRouteParameters(
252 LiferayPortletURL liferayPortletURL,
253 Map<String, String> routeParameters) {
254
255
256
257 Map<String, String[]> portletURLParameters =
258 liferayPortletURL.getParameterMap();
259
260 for (Map.Entry<String, String[]> entry :
261 portletURLParameters.entrySet()) {
262
263 String[] values = entry.getValue();
264
265 if (values.length > 0) {
266 routeParameters.put(entry.getKey(), values[0]);
267 }
268 }
269
270
271
272 String portletInstanceKey = liferayPortletURL.getPortletId();
273
274 if (Validator.isNotNull(portletInstanceKey)) {
275 routeParameters.put("p_p_id", portletInstanceKey);
276
277 PortletInstance portletInstance =
278 PortletInstance.fromPortletInstanceKey(portletInstanceKey);
279
280 routeParameters.put(
281 "userIdAndInstanceId",
282 portletInstance.getUserIdAndInstanceId());
283
284 if (portletInstance.hasInstanceId()) {
285 routeParameters.put(
286 "instanceId", portletInstance.getInstanceId());
287 }
288 }
289
290
291
292 routeParameters.putAll(liferayPortletURL.getReservedParameterMap());
293 }
294
295
306 @Deprecated
307 protected String getPortletId(Map<String, String> routeParameters) {
308 return getPortletInstanceKey(routeParameters);
309 }
310
311
321 protected String getPortletInstanceKey(
322 Map<String, String> routeParameters) {
323
324 String userIdAndInstanceId = routeParameters.remove(
325 "userIdAndInstanceId");
326
327 if (!isPortletInstanceable() && Validator.isNull(userIdAndInstanceId)) {
328 return getPortletId();
329 }
330
331 String portletInstanceKey = routeParameters.remove("p_p_id");
332
333 if (Validator.isNotNull(portletInstanceKey)) {
334 return portletInstanceKey;
335 }
336
337 if (Validator.isNotNull(userIdAndInstanceId)) {
338 PortletInstance portletInstance =
339 PortletInstance.fromPortletNameAndUserIdAndInstanceId(
340 getPortletId(), userIdAndInstanceId);
341
342 return portletInstance.getPortletInstanceKey();
343 }
344
345 String instanceId = routeParameters.remove("instanceId");
346
347 if (Validator.isNotNull(instanceId)) {
348 return PortletConstants.assemblePortletId(
349 getPortletId(), instanceId);
350 }
351
352 if (!isAllPublicRenderParameters(routeParameters)) {
353 _log.error(
354 "Either p_p_id or instanceId must be provided for an " +
355 "instanceable portlet");
356 }
357
358 return null;
359 }
360
361
369 protected boolean isAllPublicRenderParameters(
370 Map<String, String> routeParameters) {
371
372 Set<String> routeParameterKeys = routeParameters.keySet();
373
374 Map<String, String> publicRenderParameters =
375 FriendlyURLMapperThreadLocal.getPRPIdentifiers();
376
377 return routeParameterKeys.containsAll(publicRenderParameters.keySet());
378 }
379
380
391 protected void populateParams(
392 Map<String, String[]> parameterMap, String namespace,
393 Map<String, String> routeParameters) {
394
395
396
397 for (Map.Entry<String, String> entry : routeParameters.entrySet()) {
398 addParameter(
399 namespace, parameterMap, entry.getKey(), entry.getValue());
400 }
401
402
403
404 for (Map.Entry<String, String> entry :
405 defaultReservedParameters.entrySet()) {
406
407 String key = entry.getKey();
408
409 if (!parameterMap.containsKey(key)) {
410 addParameter(namespace, parameterMap, key, entry.getValue());
411 }
412 }
413 }
414
415 protected Set<String> defaultIgnoredParameters;
416 protected Map<String, String> defaultReservedParameters;
417
418 private static final Log _log = LogFactoryUtil.getLog(
419 DefaultFriendlyURLMapper.class);
420
421 }