001
014
015 package com.liferay.portlet;
016
017 import com.liferay.portal.kernel.exception.PortalException;
018 import com.liferay.portal.kernel.exception.SystemException;
019 import com.liferay.portal.kernel.language.LanguageUtil;
020 import com.liferay.portal.kernel.log.Log;
021 import com.liferay.portal.kernel.log.LogFactoryUtil;
022 import com.liferay.portal.kernel.portlet.ActionResult;
023 import com.liferay.portal.kernel.portlet.LiferayPortletMode;
024 import com.liferay.portal.kernel.portlet.PortletContainer;
025 import com.liferay.portal.kernel.portlet.PortletContainerException;
026 import com.liferay.portal.kernel.portlet.PortletContainerUtil;
027 import com.liferay.portal.kernel.portlet.PortletModeFactory;
028 import com.liferay.portal.kernel.portlet.WindowStateFactory;
029 import com.liferay.portal.kernel.servlet.BufferCacheServletResponse;
030 import com.liferay.portal.kernel.servlet.DirectRequestDispatcherFactoryUtil;
031 import com.liferay.portal.kernel.servlet.HttpHeaders;
032 import com.liferay.portal.kernel.servlet.TempAttributesServletRequest;
033 import com.liferay.portal.kernel.struts.LastPath;
034 import com.liferay.portal.kernel.upload.UploadServletRequest;
035 import com.liferay.portal.kernel.util.ArrayUtil;
036 import com.liferay.portal.kernel.util.ContentTypes;
037 import com.liferay.portal.kernel.util.JavaConstants;
038 import com.liferay.portal.kernel.util.ParamUtil;
039 import com.liferay.portal.kernel.util.StringBundler;
040 import com.liferay.portal.kernel.util.Validator;
041 import com.liferay.portal.kernel.util.WebKeys;
042 import com.liferay.portal.kernel.webdav.WebDAVStorage;
043 import com.liferay.portal.kernel.xml.QName;
044 import com.liferay.portal.model.Layout;
045 import com.liferay.portal.model.LayoutTypePortlet;
046 import com.liferay.portal.model.Portlet;
047 import com.liferay.portal.model.PortletPreferencesIds;
048 import com.liferay.portal.model.PublicRenderParameter;
049 import com.liferay.portal.model.User;
050 import com.liferay.portal.security.auth.AuthTokenUtil;
051 import com.liferay.portal.security.permission.ActionKeys;
052 import com.liferay.portal.security.permission.PermissionChecker;
053 import com.liferay.portal.security.permission.PermissionThreadLocal;
054 import com.liferay.portal.service.PortletPreferencesLocalServiceUtil;
055 import com.liferay.portal.service.ServiceContext;
056 import com.liferay.portal.service.ServiceContextFactory;
057 import com.liferay.portal.service.ServiceContextThreadLocal;
058 import com.liferay.portal.service.permission.LayoutPermissionUtil;
059 import com.liferay.portal.service.permission.PortletPermissionUtil;
060 import com.liferay.portal.theme.PortletDisplay;
061 import com.liferay.portal.theme.PortletDisplayFactory;
062 import com.liferay.portal.theme.ThemeDisplay;
063 import com.liferay.portal.upload.UploadServletRequestImpl;
064 import com.liferay.portal.util.PortalUtil;
065 import com.liferay.portal.util.PropsValues;
066 import com.liferay.taglib.aui.AUIUtil;
067 import com.liferay.util.SerializableUtil;
068
069 import java.io.Serializable;
070 import java.io.Writer;
071
072 import java.util.HashMap;
073 import java.util.List;
074 import java.util.Map;
075
076 import javax.portlet.Event;
077 import javax.portlet.PortletConfig;
078 import javax.portlet.PortletContext;
079 import javax.portlet.PortletMode;
080 import javax.portlet.PortletPreferences;
081 import javax.portlet.PortletRequest;
082 import javax.portlet.PortletResponse;
083 import javax.portlet.PortletURL;
084 import javax.portlet.RenderRequest;
085 import javax.portlet.RenderResponse;
086 import javax.portlet.WindowState;
087
088 import javax.servlet.RequestDispatcher;
089 import javax.servlet.ServletContext;
090 import javax.servlet.http.HttpServletRequest;
091 import javax.servlet.http.HttpServletResponse;
092 import javax.servlet.http.HttpSession;
093
094
097 public class PortletContainerImpl implements PortletContainer {
098
099 public void preparePortlet(HttpServletRequest request, Portlet portlet)
100 throws PortletContainerException {
101
102 try {
103 _doPreparePortlet(request, portlet);
104 }
105 catch (Exception e) {
106 throw new PortletContainerException(e);
107 }
108 }
109
110 public ActionResult processAction(
111 HttpServletRequest request, HttpServletResponse response,
112 Portlet portlet)
113 throws PortletContainerException {
114
115 try {
116 return _doProcessAction(request, response, portlet);
117 }
118 catch (Exception e) {
119 throw new PortletContainerException(e);
120 }
121 }
122
123 public List<Event> processEvent(
124 HttpServletRequest request, HttpServletResponse response,
125 Portlet portlet, Layout layout, Event event)
126 throws PortletContainerException {
127
128 try {
129 return _doProcessEvent(request, response, portlet, layout, event);
130 }
131 catch (Exception e) {
132 throw new PortletContainerException(e);
133 }
134 }
135
136 public void render(
137 HttpServletRequest request, HttpServletResponse response,
138 Portlet portlet)
139 throws PortletContainerException {
140
141 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
142 WebKeys.THEME_DISPLAY);
143
144 try {
145 _doRender(request, response, portlet);
146
147 if (themeDisplay.isIsolated() || themeDisplay.isStateExclusive()) {
148 AUIUtil.outputScriptData(request, response.getWriter());
149 }
150 }
151 catch (Exception e) {
152 throw new PortletContainerException(e);
153 }
154 }
155
156 public void serveResource(
157 HttpServletRequest request, HttpServletResponse response,
158 Portlet portlet)
159 throws PortletContainerException {
160
161 try {
162 _doServeResource(request, response, portlet);
163
164 String contentType = response.getContentType();
165
166 if (contentType.equals(ContentTypes.TEXT_HTML) ||
167 contentType.equals(ContentTypes.TEXT_HTML_UTF8)) {
168
169 AUIUtil.outputScriptData(request, response.getWriter());
170 }
171 }
172 catch (Exception e) {
173 throw new PortletContainerException(e);
174 }
175 }
176
177 protected HttpServletRequest getOwnerLayoutRequestWrapper(
178 HttpServletRequest request, Portlet portlet)
179 throws Exception {
180
181 if (!PropsValues.PORTLET_EVENT_DISTRIBUTION_LAYOUT_SET) {
182 return request;
183 }
184
185 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
186 WebKeys.THEME_DISPLAY);
187
188 Layout currentLayout = themeDisplay.getLayout();
189
190 Layout requestLayout = (Layout)request.getAttribute(WebKeys.LAYOUT);
191
192 List<LayoutTypePortlet> layoutTypePortlets =
193 PortletContainerUtil.getLayoutTypePortlets(requestLayout);
194
195 Layout ownerLayout = null;
196 LayoutTypePortlet ownerLayoutTypePortlet = null;
197
198 for (LayoutTypePortlet layoutTypePortlet : layoutTypePortlets) {
199 if (layoutTypePortlet.hasPortletId(portlet.getPortletId())) {
200 ownerLayoutTypePortlet = layoutTypePortlet;
201
202 ownerLayout = layoutTypePortlet.getLayout();
203
204 break;
205 }
206 }
207
208 if ((ownerLayout != null) && !currentLayout.equals(ownerLayout)) {
209 ThemeDisplay themeDisplayClone = (ThemeDisplay)themeDisplay.clone();
210
211 themeDisplayClone.setLayout(ownerLayout);
212 themeDisplayClone.setLayoutTypePortlet(ownerLayoutTypePortlet);
213
214 TempAttributesServletRequest tempAttributesServletRequest =
215 new TempAttributesServletRequest(request);
216
217 tempAttributesServletRequest.setTempAttribute(
218 WebKeys.THEME_DISPLAY, themeDisplayClone);
219 tempAttributesServletRequest.setTempAttribute(
220 WebKeys.LAYOUT, ownerLayout);
221
222 return tempAttributesServletRequest;
223 }
224
225 return request;
226 }
227
228 protected long getScopeGroupId(
229 HttpServletRequest request, Layout layout, String portletId)
230 throws PortalException, SystemException {
231
232 long scopeGroupId = 0;
233
234 Layout requestLayout = (Layout)request.getAttribute(WebKeys.LAYOUT);
235
236 try {
237 request.setAttribute(WebKeys.LAYOUT, layout);
238
239 scopeGroupId = PortalUtil.getScopeGroupId(request, portletId);
240 }
241 finally {
242 request.setAttribute(WebKeys.LAYOUT, requestLayout);
243 }
244
245 if (scopeGroupId <= 0) {
246 scopeGroupId = PortalUtil.getScopeGroupId(layout, portletId);
247 }
248
249 return scopeGroupId;
250 }
251
252 protected void processPublicRenderParameters(
253 HttpServletRequest request, Layout layout, Portlet portlet) {
254
255 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
256 WebKeys.THEME_DISPLAY);
257
258 Map<String, String[]> publicRenderParameters =
259 PublicRenderParametersPool.get(request, layout.getPlid());
260
261 Map<String, String[]> parameters = request.getParameterMap();
262
263 for (Map.Entry<String, String[]> entry : parameters.entrySet()) {
264 String name = entry.getKey();
265
266 QName qName = PortletQNameUtil.getQName(name);
267
268 if (qName == null) {
269 continue;
270 }
271
272 PublicRenderParameter publicRenderParameter =
273 portlet.getPublicRenderParameter(
274 qName.getNamespaceURI(), qName.getLocalPart());
275
276 if (publicRenderParameter == null) {
277 continue;
278 }
279
280 String publicRenderParameterName =
281 PortletQNameUtil.getPublicRenderParameterName(qName);
282
283 if (name.startsWith(
284 PortletQName.PUBLIC_RENDER_PARAMETER_NAMESPACE)) {
285
286 String[] values = entry.getValue();
287
288 if (themeDisplay.isLifecycleAction()) {
289 String[] oldValues = publicRenderParameters.get(
290 publicRenderParameterName);
291
292 if ((oldValues != null) && (oldValues.length != 0)) {
293 values = ArrayUtil.append(values, oldValues);
294 }
295 }
296
297 publicRenderParameters.put(publicRenderParameterName, values);
298 }
299 else {
300 publicRenderParameters.remove(publicRenderParameterName);
301 }
302 }
303 }
304
305 protected Event serializeEvent(
306 Event event, ClassLoader portletClassLoader) {
307
308 Serializable value = event.getValue();
309
310 if (value == null) {
311 return event;
312 }
313
314 Class<?> valueClass = value.getClass();
315
316 String valueClassName = valueClass.getName();
317
318 try {
319 Class<?> loadedValueClass = portletClassLoader.loadClass(
320 valueClassName);
321
322 if (loadedValueClass.equals(valueClass)) {
323 return event;
324 }
325 }
326 catch (ClassNotFoundException cnfe) {
327 throw new RuntimeException(cnfe);
328 }
329
330 byte[] serializedValue = SerializableUtil.serialize(value);
331
332 value = (Serializable)SerializableUtil.deserialize(
333 serializedValue, portletClassLoader);
334
335 return new EventImpl(event.getName(), event.getQName(), value);
336 }
337
338 private void _doPreparePortlet(HttpServletRequest request, Portlet portlet)
339 throws Exception {
340
341 User user = PortalUtil.getUser(request);
342 Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);
343
344 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
345 WebKeys.THEME_DISPLAY);
346
347 long scopeGroupId = PortalUtil.getScopeGroupId(
348 request, portlet.getPortletId());
349 long siteGroupId = PortalUtil.getSiteGroupId(scopeGroupId);
350
351 themeDisplay.setScopeGroupId(scopeGroupId);
352 themeDisplay.setSiteGroupId(siteGroupId);
353
354 if (user != null) {
355 HttpSession session = request.getSession();
356
357 InvokerPortletImpl.clearResponse(
358 session, layout.getPrimaryKey(), portlet.getPortletId(),
359 LanguageUtil.getLanguageId(request));
360 }
361
362 processPublicRenderParameters(request, layout, portlet);
363
364 if (themeDisplay.isLifecycleRender() ||
365 themeDisplay.isLifecycleResource()) {
366
367 WindowState windowState = WindowStateFactory.getWindowState(
368 ParamUtil.getString(request, "p_p_state"));
369
370 if (layout.isTypeControlPanel() &&
371 ((windowState == null) ||
372 windowState.equals(WindowState.NORMAL) ||
373 Validator.isNull(windowState.toString()))) {
374
375 windowState = WindowState.MAXIMIZED;
376 }
377
378 PortletMode portletMode = PortletModeFactory.getPortletMode(
379 ParamUtil.getString(request, "p_p_mode"));
380
381 PortalUtil.updateWindowState(
382 portlet.getPortletId(), user, layout, windowState, request);
383
384 PortalUtil.updatePortletMode(
385 portlet.getPortletId(), user, layout, portletMode, request);
386 }
387 }
388
389 private ActionResult _doProcessAction(
390 HttpServletRequest request, HttpServletResponse response,
391 Portlet portlet)
392 throws Exception {
393
394 HttpServletRequest ownerLayoutRequest = getOwnerLayoutRequestWrapper(
395 request, portlet);
396
397 Layout ownerLayout = (Layout)ownerLayoutRequest.getAttribute(
398 WebKeys.LAYOUT);
399
400 boolean allowAddPortletDefaultResource =
401 PortalUtil.isAllowAddPortletDefaultResource(
402 ownerLayoutRequest, portlet);
403
404 if (!allowAddPortletDefaultResource) {
405 String url = null;
406
407 LastPath lastPath = (LastPath)request.getAttribute(
408 WebKeys.LAST_PATH);
409
410 if (lastPath != null) {
411 StringBundler sb = new StringBundler(3);
412
413 sb.append(PortalUtil.getPortalURL(request));
414 sb.append(lastPath.getContextPath());
415 sb.append(lastPath.getPath());
416
417 url = sb.toString();
418 }
419 else {
420 url = String.valueOf(request.getRequestURI());
421 }
422
423 _log.error(
424 "Reject processAction for " + url + " on " +
425 portlet.getPortletId());
426
427 return ActionResult.EMPTY_ACTION_RESULT;
428 }
429
430 Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);
431
432 WindowState windowState = WindowStateFactory.getWindowState(
433 ParamUtil.getString(request, "p_p_state"));
434
435 if (layout.isTypeControlPanel() &&
436 ((windowState == null) || windowState.equals(WindowState.NORMAL) ||
437 Validator.isNull(windowState.toString()))) {
438
439 windowState = WindowState.MAXIMIZED;
440 }
441
442 PortletMode portletMode = PortletModeFactory.getPortletMode(
443 ParamUtil.getString(request, "p_p_mode"));
444
445 PortletPreferencesIds portletPreferencesIds =
446 PortletPreferencesFactoryUtil.getPortletPreferencesIds(
447 request, portlet.getPortletId());
448
449 PortletPreferences portletPreferences =
450 PortletPreferencesLocalServiceUtil.getPreferences(
451 portletPreferencesIds);
452
453 ServletContext servletContext = (ServletContext)request.getAttribute(
454 WebKeys.CTX);
455
456 InvokerPortlet invokerPortlet = PortletInstanceFactoryUtil.create(
457 portlet, servletContext);
458
459 PortletConfig portletConfig = PortletConfigFactoryUtil.create(
460 portlet, servletContext);
461 PortletContext portletContext = portletConfig.getPortletContext();
462
463 String contentType = request.getHeader(HttpHeaders.CONTENT_TYPE);
464
465 if (_log.isDebugEnabled()) {
466 _log.debug("Content type " + contentType);
467 }
468
469 UploadServletRequest uploadServletRequest = null;
470
471 try {
472 if ((contentType != null) &&
473 contentType.startsWith(ContentTypes.MULTIPART_FORM_DATA)) {
474
475 PortletConfigImpl invokerPortletConfigImpl =
476 (PortletConfigImpl)invokerPortlet.getPortletConfig();
477
478 if (invokerPortlet.isStrutsPortlet() ||
479 invokerPortletConfigImpl.isCopyRequestParameters() ||
480 !invokerPortletConfigImpl.isWARFile()) {
481
482 uploadServletRequest = new UploadServletRequestImpl(
483 request);
484
485 request = uploadServletRequest;
486 }
487 }
488
489 if (PropsValues.AUTH_TOKEN_CHECK_ENABLED &&
490 invokerPortlet.isCheckAuthToken()) {
491
492 AuthTokenUtil.check(request);
493 }
494
495 ActionRequestImpl actionRequestImpl = ActionRequestFactory.create(
496 request, portlet, invokerPortlet, portletContext, windowState,
497 portletMode, portletPreferences, layout.getPlid());
498
499 User user = PortalUtil.getUser(request);
500
501 ActionResponseImpl actionResponseImpl =
502 ActionResponseFactory.create(
503 actionRequestImpl, response, portlet.getPortletId(), user,
504 layout, windowState, portletMode);
505
506 actionRequestImpl.defineObjects(portletConfig, actionResponseImpl);
507
508 ServiceContext serviceContext = ServiceContextFactory.getInstance(
509 actionRequestImpl);
510
511 ServiceContextThreadLocal.pushServiceContext(serviceContext);
512
513 PermissionChecker permissionChecker =
514 PermissionThreadLocal.getPermissionChecker();
515
516 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
517 WebKeys.THEME_DISPLAY);
518
519 long scopeGroupId = themeDisplay.getScopeGroupId();
520
521 boolean access = PortletPermissionUtil.hasAccessPermission(
522 permissionChecker, scopeGroupId, ownerLayout, portlet,
523 portletMode);
524
525 if (access) {
526 invokerPortlet.processAction(
527 actionRequestImpl, actionResponseImpl);
528
529 actionResponseImpl.transferHeaders(response);
530 }
531
532 RenderParametersPool.put(
533 request, layout.getPlid(), portlet.getPortletId(),
534 actionResponseImpl.getRenderParameterMap());
535
536 List<Event> events = actionResponseImpl.getEvents();
537
538 String redirectLocation = actionResponseImpl.getRedirectLocation();
539
540 if (Validator.isNull(redirectLocation) &&
541 portlet.isActionURLRedirect()) {
542
543 PortletURL portletURL = new PortletURLImpl(
544 actionRequestImpl, actionRequestImpl.getPortletName(),
545 layout.getPlid(), PortletRequest.RENDER_PHASE);
546
547 Map<String, String[]> renderParameters =
548 actionResponseImpl.getRenderParameterMap();
549
550 for (Map.Entry<String, String[]> entry :
551 renderParameters.entrySet()) {
552
553 String key = entry.getKey();
554 String[] value = entry.getValue();
555
556 portletURL.setParameter(key, value);
557 }
558
559 redirectLocation = portletURL.toString();
560 }
561
562 return new ActionResult(events, redirectLocation);
563 }
564 finally {
565 if (uploadServletRequest != null) {
566 uploadServletRequest.cleanUp();
567 }
568
569 ServiceContextThreadLocal.popServiceContext();
570 }
571 }
572
573 private List<Event> _doProcessEvent(
574 HttpServletRequest request, HttpServletResponse response,
575 Portlet portlet, Layout layout, Event event)
576 throws Exception {
577
578 ServletContext servletContext = (ServletContext)request.getAttribute(
579 WebKeys.CTX);
580
581 InvokerPortlet invokerPortlet = PortletInstanceFactoryUtil.create(
582 portlet, servletContext);
583
584 PortletConfig portletConfig = PortletConfigFactoryUtil.create(
585 portlet, servletContext);
586 PortletContext portletContext = portletConfig.getPortletContext();
587
588 LayoutTypePortlet layoutTypePortlet =
589 (LayoutTypePortlet)layout.getLayoutType();
590
591 WindowState windowState = null;
592
593 if (layoutTypePortlet.hasStateMaxPortletId(portlet.getPortletId())) {
594 windowState = WindowState.MAXIMIZED;
595 }
596 else if (layoutTypePortlet.hasStateMinPortletId(
597 portlet.getPortletId())) {
598
599 windowState = WindowState.MINIMIZED;
600 }
601 else {
602 windowState = WindowState.NORMAL;
603 }
604
605 PortletMode portletMode = null;
606
607 if (layoutTypePortlet.hasModeAboutPortletId(portlet.getPortletId())) {
608 portletMode = LiferayPortletMode.ABOUT;
609 }
610 else if (layoutTypePortlet.hasModeConfigPortletId(
611 portlet.getPortletId())) {
612
613 portletMode = LiferayPortletMode.CONFIG;
614 }
615 else if (layoutTypePortlet.hasModeEditPortletId(
616 portlet.getPortletId())) {
617
618 portletMode = PortletMode.EDIT;
619 }
620 else if (layoutTypePortlet.hasModeEditDefaultsPortletId(
621 portlet.getPortletId())) {
622
623 portletMode = LiferayPortletMode.EDIT_DEFAULTS;
624 }
625 else if (layoutTypePortlet.hasModeEditGuestPortletId(
626 portlet.getPortletId())) {
627
628 portletMode = LiferayPortletMode.EDIT_GUEST;
629 }
630 else if (layoutTypePortlet.hasModeHelpPortletId(
631 portlet.getPortletId())) {
632
633 portletMode = PortletMode.HELP;
634 }
635 else if (layoutTypePortlet.hasModePreviewPortletId(
636 portlet.getPortletId())) {
637
638 portletMode = LiferayPortletMode.PREVIEW;
639 }
640 else if (layoutTypePortlet.hasModePrintPortletId(
641 portlet.getPortletId())) {
642
643 portletMode = LiferayPortletMode.PRINT;
644 }
645 else {
646 portletMode = PortletMode.VIEW;
647 }
648
649 long scopeGroupId = getScopeGroupId(
650 request, layout, portlet.getPortletId());
651
652 PortletPreferences portletPreferences =
653 PortletPreferencesFactoryUtil.getPortletSetup(
654 scopeGroupId, layout, portlet.getPortletId(), null);
655
656 EventRequestImpl eventRequestImpl = EventRequestFactory.create(
657 request, portlet, invokerPortlet, portletContext, windowState,
658 portletMode, portletPreferences, layout.getPlid());
659
660 eventRequestImpl.setEvent(
661 serializeEvent(event, invokerPortlet.getPortletClassLoader()));
662
663 User user = PortalUtil.getUser(request);
664 Layout requestLayout = (Layout)request.getAttribute(WebKeys.LAYOUT);
665
666 EventResponseImpl eventResponseImpl = EventResponseFactory.create(
667 eventRequestImpl, response, portlet.getPortletId(), user,
668 requestLayout);
669
670 eventRequestImpl.defineObjects(portletConfig, eventResponseImpl);
671
672 try {
673 invokerPortlet.processEvent(eventRequestImpl, eventResponseImpl);
674
675 if (eventResponseImpl.isCalledSetRenderParameter()) {
676 Map<String, String[]> renderParameterMap =
677 new HashMap<String, String[]>();
678
679 renderParameterMap.putAll(
680 eventResponseImpl.getRenderParameterMap());
681
682 RenderParametersPool.put(
683 request, requestLayout.getPlid(), portlet.getPortletId(),
684 renderParameterMap);
685 }
686
687 return eventResponseImpl.getEvents();
688 }
689 finally {
690 eventRequestImpl.cleanUp();
691 }
692 }
693
694 private void _doRender(
695 HttpServletRequest request, HttpServletResponse response,
696 Portlet portlet)
697 throws Exception {
698
699 if ((portlet != null) && portlet.isInstanceable() &&
700 !portlet.isAddDefaultResource()) {
701
702 String instanceId = portlet.getInstanceId();
703
704 if (!Validator.isPassword(instanceId)) {
705 if (_log.isDebugEnabled()) {
706 _log.debug(
707 "Portlet " + portlet.getPortletId() +
708 " is instanceable but does not have a valid " +
709 "instance id");
710 }
711
712 portlet = null;
713 }
714 }
715
716 if (portlet == null) {
717 return;
718 }
719
720
721
722
723 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
724 WebKeys.THEME_DISPLAY);
725
726 PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
727
728 PortletDisplay portletDisplayClone = PortletDisplayFactory.create();
729
730 portletDisplay.copyTo(portletDisplayClone);
731
732 PortletConfig portletConfig = (PortletConfig)request.getAttribute(
733 JavaConstants.JAVAX_PORTLET_CONFIG);
734
735 PortletRequest portletRequest = (PortletRequest)request.getAttribute(
736 JavaConstants.JAVAX_PORTLET_REQUEST);
737
738 if (!(portletRequest instanceof RenderRequest)) {
739 portletRequest = null;
740 }
741
742 PortletResponse portletResponse = (PortletResponse)request.getAttribute(
743 JavaConstants.JAVAX_PORTLET_RESPONSE);
744
745 if (!(portletResponse instanceof RenderResponse)) {
746 portletResponse = null;
747 }
748
749 String lifecycle = (String)request.getAttribute(
750 PortletRequest.LIFECYCLE_PHASE);
751
752 request.setAttribute(WebKeys.RENDER_PORTLET, portlet);
753
754 String path = (String)request.getAttribute(WebKeys.RENDER_PATH);
755
756 if (path == null) {
757 path = "/html/portal/render_portlet.jsp";
758 }
759
760 RequestDispatcher requestDispatcher =
761 DirectRequestDispatcherFactoryUtil.getRequestDispatcher(
762 request, path);
763
764 BufferCacheServletResponse bufferCacheServletResponse = null;
765
766 boolean writeOutput = false;
767
768 if (response instanceof BufferCacheServletResponse) {
769 bufferCacheServletResponse = (BufferCacheServletResponse)response;
770 }
771 else {
772 writeOutput = true;
773 bufferCacheServletResponse = new BufferCacheServletResponse(
774 response);
775 }
776
777 try {
778 requestDispatcher.include(request, bufferCacheServletResponse);
779
780 Boolean portletConfiguratorVisibility =
781 (Boolean)request.getAttribute(
782 WebKeys.PORTLET_CONFIGURATOR_VISIBILITY);
783
784 if (portletConfiguratorVisibility != null) {
785 request.removeAttribute(
786 WebKeys.PORTLET_CONFIGURATOR_VISIBILITY);
787
788 Layout layout = themeDisplay.getLayout();
789
790 if (!layout.isTypeControlPanel() &&
791 !LayoutPermissionUtil.contains(
792 themeDisplay.getPermissionChecker(), layout,
793 ActionKeys.UPDATE) &&
794 !PortletPermissionUtil.contains(
795 themeDisplay.getPermissionChecker(), layout,
796 portlet.getPortletId(), ActionKeys.CONFIGURATION)) {
797
798 bufferCacheServletResponse.setCharBuffer(null);
799
800 return;
801 }
802 }
803
804 if (writeOutput) {
805 Writer writer = response.getWriter();
806
807 writer.write(bufferCacheServletResponse.getString());
808 }
809 }
810 finally {
811 portletDisplay.copyFrom(portletDisplayClone);
812
813 portletDisplayClone.recycle();
814
815 if (portletConfig != null) {
816 request.setAttribute(
817 JavaConstants.JAVAX_PORTLET_CONFIG, portletConfig);
818 }
819
820 if (portletRequest != null) {
821 request.setAttribute(
822 JavaConstants.JAVAX_PORTLET_REQUEST, portletRequest);
823 }
824
825 if (portletResponse != null) {
826 request.setAttribute(
827 JavaConstants.JAVAX_PORTLET_RESPONSE, portletResponse);
828 }
829
830 if (lifecycle != null) {
831 request.setAttribute(PortletRequest.LIFECYCLE_PHASE, lifecycle);
832 }
833
834 request.removeAttribute(WebKeys.RENDER_PORTLET);
835 }
836 }
837
838 private void _doServeResource(
839 HttpServletRequest request, HttpServletResponse response,
840 Portlet portlet)
841 throws Exception {
842
843 HttpServletRequest ownerLayoutRequest = getOwnerLayoutRequestWrapper(
844 request, portlet);
845
846 Layout ownerLayout = (Layout)ownerLayoutRequest.getAttribute(
847 WebKeys.LAYOUT);
848
849 boolean allowAddPortletDefaultResource =
850 PortalUtil.isAllowAddPortletDefaultResource(
851 ownerLayoutRequest, portlet);
852
853 if (!allowAddPortletDefaultResource) {
854 String url = null;
855
856 LastPath lastPath = (LastPath)request.getAttribute(
857 WebKeys.LAST_PATH);
858
859 if (lastPath != null) {
860 StringBundler sb = new StringBundler(3);
861
862 sb.append(PortalUtil.getPortalURL(request));
863 sb.append(lastPath.getContextPath());
864 sb.append(lastPath.getPath());
865
866 url = sb.toString();
867 }
868 else {
869 url = String.valueOf(request.getRequestURI());
870 }
871
872 response.setHeader(
873 HttpHeaders.CACHE_CONTROL,
874 HttpHeaders.CACHE_CONTROL_NO_CACHE_VALUE);
875 response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
876
877 _log.error(
878 "Reject serveResource for " + url + " on " +
879 portlet.getPortletId());
880
881 return;
882 }
883
884 WindowState windowState = (WindowState)request.getAttribute(
885 WebKeys.WINDOW_STATE);
886
887 PortletMode portletMode = PortletModeFactory.getPortletMode(
888 ParamUtil.getString(request, "p_p_mode"));
889
890 PortletPreferencesIds portletPreferencesIds =
891 PortletPreferencesFactoryUtil.getPortletPreferencesIds(
892 request, portlet.getPortletId());
893
894 PortletPreferences portletPreferences =
895 PortletPreferencesLocalServiceUtil.getPreferences(
896 portletPreferencesIds);
897
898 ServletContext servletContext = (ServletContext)request.getAttribute(
899 WebKeys.CTX);
900
901 InvokerPortlet invokerPortlet = PortletInstanceFactoryUtil.create(
902 portlet, servletContext);
903
904 PortletConfig portletConfig = PortletConfigFactoryUtil.create(
905 portlet, servletContext);
906 PortletContext portletContext = portletConfig.getPortletContext();
907
908 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
909 WebKeys.THEME_DISPLAY);
910
911 PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
912
913 Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);
914
915 String portletPrimaryKey = PortletPermissionUtil.getPrimaryKey(
916 layout.getPlid(), portlet.getPortletId());
917
918 portletDisplay.setId(portlet.getPortletId());
919 portletDisplay.setRootPortletId(portlet.getRootPortletId());
920 portletDisplay.setInstanceId(portlet.getInstanceId());
921 portletDisplay.setResourcePK(portletPrimaryKey);
922 portletDisplay.setPortletName(portletConfig.getPortletName());
923 portletDisplay.setNamespace(
924 PortalUtil.getPortletNamespace(portlet.getPortletId()));
925
926 WebDAVStorage webDAVStorage = portlet.getWebDAVStorageInstance();
927
928 if (webDAVStorage != null) {
929 portletDisplay.setWebDAVEnabled(true);
930 }
931 else {
932 portletDisplay.setWebDAVEnabled(false);
933 }
934
935 ResourceRequestImpl resourceRequestImpl = ResourceRequestFactory.create(
936 request, portlet, invokerPortlet, portletContext, windowState,
937 portletMode, portletPreferences, layout.getPlid());
938
939 long companyId = PortalUtil.getCompanyId(request);
940
941 ResourceResponseImpl resourceResponseImpl =
942 ResourceResponseFactory.create(
943 resourceRequestImpl, response, portlet.getPortletId(),
944 companyId);
945
946 resourceRequestImpl.defineObjects(portletConfig, resourceResponseImpl);
947
948 try {
949 ServiceContext serviceContext = ServiceContextFactory.getInstance(
950 resourceRequestImpl);
951
952 ServiceContextThreadLocal.pushServiceContext(serviceContext);
953
954 PermissionChecker permissionChecker =
955 PermissionThreadLocal.getPermissionChecker();
956
957 long scopeGroupId = themeDisplay.getScopeGroupId();
958
959 boolean access = PortletPermissionUtil.hasAccessPermission(
960 permissionChecker, scopeGroupId, ownerLayout, portlet,
961 portletMode);
962
963 if (access) {
964 invokerPortlet.serveResource(
965 resourceRequestImpl, resourceResponseImpl);
966
967 resourceResponseImpl.transferHeaders(response);
968 }
969 }
970 finally {
971 ServiceContextThreadLocal.popServiceContext();
972 }
973 }
974
975 private static Log _log = LogFactoryUtil.getLog(PortletContainerImpl.class);
976
977 }