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