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