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