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