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