среда, 15 мая 2013 г.

Liferay вложенные портлеты 2

Способ вызова портлета внутри портлета предложенный в первом посте не работает в Liferay 5.2.3, который идет в бандле с Tomcat 6. Использовать PortletBagPool для получения портального ServletContext бесполезно, т.к. в версии 5.2.3 PortletBagPool не содержить встроенные портлеты.

Получить портальный ServletContext можно получить из аттрибутов ServletRequest - оказывается он передается с ключом WebKeys.CTX. Кроме того PortalUtil в API 5.2.3 немного отличается:
    public static String renderPortlet(final PortletRequest request, final PortletResponse response, final String portletId, final String queryString) {
        String result = "Error occured while running portlet";
        try {
            // Get servlet request / response
            HttpServletRequest servletRequest = PortalUtil.getHttpServletRequest(request);
            HttpServletResponse servletResponse = PortalUtil.getHttpServletResponse(response);
            HttpServletRequest portalServletRequest = PortalUtil.getOriginalServletRequest(servletRequest);

            // Get theme display
            final ThemeDisplay themeDisplay = (ThemeDisplay) servletRequest.getAttribute(WebKeys.THEME_DISPLAY);
            // Backup current state
            PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
            PortletDisplay portletDisplayClone = new PortletDisplay();
            portletDisplay.copyTo(portletDisplayClone);
            final Map requestAttributeBackup = new HashMap();
            for (final String key : Collections.list((Enumeration) servletRequest.getAttributeNames())) {
                requestAttributeBackup.put(key, servletRequest.getAttribute(key));
            }
            // Render the portlet as a runtime portlet
            try {
                StringBuilder sb = new StringBuilder();
                com.liferay.portal.model.Portlet portlet = PortletLocalServiceUtil.getPortletById(PortalUtil.getCompanyId(request), portletId);
                servletRequest.setAttribute(WebKeys.RENDER_PORTLET_RESOURCE, Boolean.TRUE);
                ServletContext ctx = (ServletContext) portalServletRequest.getAttribute(WebKeys.CTX);
                PortalUtil.renderPortlet(sb, ctx, servletRequest, servletResponse, portlet, queryString);
                result = sb.toString();
            } finally {
                // Restore the state
                portletDisplay.copyFrom(portletDisplayClone);
                portletDisplayClone.recycle();
                for (final String key : Collections.list((Enumeration) servletRequest.getAttributeNames())) {
                    if (!requestAttributeBackup.containsKey(key)) {
                        servletRequest.removeAttribute(key);
                    }
                }
                for (final Map.Entry entry : requestAttributeBackup.entrySet()) {
                    servletRequest.setAttribute(entry.getKey(), entry.getValue());
                }
            }
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
        }
        return result;

    }  

Комментариев нет:

Отправить комментарий