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 public String buildPath(LiferayPortletURL liferayPortletURL) {
099 Map<String, String> routeParameters = new HashMap<String, String>();
100
101 buildRouteParameters(liferayPortletURL, routeParameters);
102
103 String friendlyURLPath = router.parametersToUrl(routeParameters);
104
105 if (friendlyURLPath == null) {
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 public void populateParams(
138 String friendlyURLPath, Map<String, String[]> parameterMap,
139 Map<String, Object> requestContext) {
140
141 friendlyURLPath = friendlyURLPath.substring(getMapping().length() + 1);
142
143 Map<String, String> routeParameters = new HashMap<String, String>();
144
145 if (!router.urlToParameters(friendlyURLPath, routeParameters)) {
146 if (_log.isWarnEnabled()) {
147 _log.warn(
148 "No route could be found to match URL " + friendlyURLPath);
149 }
150
151 return;
152 }
153
154 String portletId = getPortletId(routeParameters);
155
156 if (portletId == null) {
157 return;
158 }
159
160 String namespace = PortalUtil.getPortletNamespace(portletId);
161
162 addParameter(namespace, parameterMap, "p_p_id", portletId);
163
164 populateParams(parameterMap, namespace, routeParameters);
165 }
166
167
181 protected void buildRouteParameters(
182 LiferayPortletURL liferayPortletURL,
183 Map<String, String> routeParameters) {
184
185
186
187 Map<String, String[]> portletURLParameters =
188 liferayPortletURL.getParameterMap();
189
190 for (Map.Entry<String, String[]> entry :
191 portletURLParameters.entrySet()) {
192
193 String[] values = entry.getValue();
194
195 if (values.length > 0) {
196 routeParameters.put(entry.getKey(), values[0]);
197 }
198 }
199
200
201
202 if (isPortletInstanceable()) {
203 String portletId = liferayPortletURL.getPortletId();
204
205 routeParameters.put("p_p_id", portletId);
206
207 if (Validator.isNotNull(portletId)) {
208 String[] parts = portletId.split(
209 PortletConstants.INSTANCE_SEPARATOR);
210
211 if (parts.length > 1) {
212 routeParameters.put("instanceId", parts[1]);
213 }
214 }
215 }
216
217
218
219 routeParameters.putAll(liferayPortletURL.getReservedParameterMap());
220 }
221
222
232 protected String getPortletId(Map<String, String> routeParameters) {
233 if (!isPortletInstanceable()) {
234 return getPortletId();
235 }
236
237 String portletId = routeParameters.remove("p_p_id");
238
239 if (Validator.isNotNull(portletId)) {
240 return portletId;
241 }
242
243 String instanceId = routeParameters.remove("instanceId");
244
245 if (Validator.isNull(instanceId)) {
246 if (_log.isErrorEnabled()) {
247 _log.error(
248 "Either p_p_id or instanceId must be provided for an " +
249 "instanceable portlet");
250 }
251
252 return null;
253 }
254 else {
255 return getPortletId().concat(
256 PortletConstants.INSTANCE_SEPARATOR).concat(instanceId);
257 }
258 }
259
260
271 protected void populateParams(
272 Map<String, String[]> parameterMap, String namespace,
273 Map<String, String> routeParameters) {
274
275
276
277 for (Map.Entry<String, String> entry : routeParameters.entrySet()) {
278 addParameter(
279 namespace, parameterMap, entry.getKey(), entry.getValue());
280 }
281
282
283
284 for (Map.Entry<String, String> entry :
285 defaultReservedParameters.entrySet()) {
286
287 String key = entry.getKey();
288
289 if (!parameterMap.containsKey(key)) {
290 addParameter(namespace, parameterMap, key, entry.getValue());
291 }
292 }
293 }
294
295
311 protected void addParametersIncludedInPath(
312 LiferayPortletURL liferayPortletURL,
313 Map<String, String> routeParameters) {
314
315
316
317 for (String name : defaultIgnoredParameters) {
318 liferayPortletURL.addParameterIncludedInPath(name);
319 }
320
321
322
323 Map<String, String[]> portletURLParameters =
324 liferayPortletURL.getParameterMap();
325
326 for (String name : portletURLParameters.keySet()) {
327 if (!routeParameters.containsKey(name)) {
328 liferayPortletURL.addParameterIncludedInPath(name);
329 }
330 }
331
332
333
334 Map<String, String> reservedParameters =
335 liferayPortletURL.getReservedParameterMap();
336
337 for (Map.Entry<String, String> entry : reservedParameters.entrySet()) {
338 String key = entry.getKey();
339 String value = entry.getValue();
340
341 if (!routeParameters.containsKey(key) ||
342 value.equals(defaultReservedParameters.get(key))) {
343
344 liferayPortletURL.addParameterIncludedInPath(key);
345 }
346 }
347 }
348
349 protected Set<String> defaultIgnoredParameters;
350 protected Map<String, String> defaultReservedParameters;
351
352 private static Log _log = LogFactoryUtil.getLog(
353 DefaultFriendlyURLMapper.class);
354
355 }