001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
014    
015    package com.liferay.taglib.portletext;
016    
017    import com.liferay.portal.kernel.json.JSONFactoryUtil;
018    import com.liferay.portal.kernel.json.JSONObject;
019    import com.liferay.portal.kernel.log.Log;
020    import com.liferay.portal.kernel.log.LogFactoryUtil;
021    import com.liferay.portal.kernel.portlet.PortletContainerUtil;
022    import com.liferay.portal.kernel.portlet.PortletJSONUtil;
023    import com.liferay.portal.kernel.portlet.PortletLayoutListener;
024    import com.liferay.portal.kernel.portlet.PortletParameterUtil;
025    import com.liferay.portal.kernel.portlet.RestrictPortletServletRequest;
026    import com.liferay.portal.kernel.servlet.DynamicServletRequest;
027    import com.liferay.portal.kernel.servlet.PipingServletResponse;
028    import com.liferay.portal.kernel.util.MapUtil;
029    import com.liferay.portal.kernel.util.PrefixPredicateFilter;
030    import com.liferay.portal.kernel.util.StringPool;
031    import com.liferay.portal.kernel.util.WebKeys;
032    import com.liferay.portal.model.Layout;
033    import com.liferay.portal.model.LayoutTypePortlet;
034    import com.liferay.portal.model.Portlet;
035    import com.liferay.portal.service.PortletLocalServiceUtil;
036    import com.liferay.portal.service.PortletPreferencesLocalServiceUtil;
037    import com.liferay.portal.theme.ThemeDisplay;
038    import com.liferay.portal.util.PortletKeys;
039    import com.liferay.portlet.PortletPreferencesFactoryUtil;
040    
041    import java.util.HashMap;
042    import java.util.Map;
043    
044    import javax.servlet.http.HttpServletRequest;
045    import javax.servlet.http.HttpServletResponse;
046    import javax.servlet.jsp.JspException;
047    import javax.servlet.jsp.PageContext;
048    import javax.servlet.jsp.tagext.TagSupport;
049    
050    /**
051     * @author Brian Wing Shun Chan
052     */
053    public class RuntimeTag extends TagSupport {
054    
055            public static void doTag(
056                            String portletName, PageContext pageContext,
057                            HttpServletRequest request, HttpServletResponse response)
058                    throws Exception {
059    
060                    doTag(portletName, null, pageContext, request, response);
061            }
062    
063            public static void doTag(
064                            String portletName, String queryString, PageContext pageContext,
065                            HttpServletRequest request, HttpServletResponse response)
066                    throws Exception {
067    
068                    doTag(portletName, queryString, null, pageContext, request, response);
069            }
070    
071            public static void doTag(
072                            String portletName, String queryString, String defaultPreferences,
073                            PageContext pageContext, HttpServletRequest request,
074                            HttpServletResponse response)
075                    throws Exception {
076    
077                    if (pageContext != null) {
078                            response = new PipingServletResponse(
079                                    response, pageContext.getOut());
080                    }
081    
082                    String portletId = portletName;
083    
084                    RestrictPortletServletRequest restrictPortletServletRequest =
085                            new RestrictPortletServletRequest(request);
086    
087                    queryString = PortletParameterUtil.addNamespace(portletId, queryString);
088    
089                    Map<String, String[]> parameterMap = request.getParameterMap();
090    
091                    if (!portletId.equals(request.getParameter("p_p_id"))) {
092                            parameterMap = MapUtil.filter(
093                                    parameterMap, new HashMap<String, String[]>(),
094                                    new PrefixPredicateFilter("p_p_"));
095                    }
096    
097                    request = DynamicServletRequest.addQueryString(
098                            restrictPortletServletRequest, parameterMap, queryString, false);
099    
100                    try {
101                            request.setAttribute(WebKeys.RENDER_PORTLET_RESOURCE, Boolean.TRUE);
102    
103                            ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
104                                    WebKeys.THEME_DISPLAY);
105    
106                            if (themeDisplay.isStateMaximized()) {
107                                    LayoutTypePortlet layoutTypePortlet =
108                                            themeDisplay.getLayoutTypePortlet();
109    
110                                    if (layoutTypePortlet.hasStateMaxPortletId(portletId)) {
111    
112                                            // A portlet in the maximized state has already been
113                                            // processed
114    
115                                            return;
116                                    }
117                            }
118    
119                            Layout layout = themeDisplay.getLayout();
120    
121                            Portlet portlet = getPortlet(
122                                    themeDisplay.getCompanyId(), portletId);
123    
124                            JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
125    
126                            if ((PortletPreferencesLocalServiceUtil.getPortletPreferencesCount(
127                                            PortletKeys.PREFS_OWNER_TYPE_LAYOUT, themeDisplay.getPlid(),
128                                            portletId) < 1) ||
129                                    layout.isTypeControlPanel() ||
130                                    layout.isTypePanel()) {
131    
132                                    PortletPreferencesFactoryUtil.getLayoutPortletSetup(
133                                            layout, portletId, defaultPreferences);
134                                    PortletPreferencesFactoryUtil.getPortletSetup(
135                                            request, portletId, defaultPreferences);
136    
137                                    PortletLayoutListener portletLayoutListener =
138                                            portlet.getPortletLayoutListenerInstance();
139    
140                                    if (portletLayoutListener != null) {
141                                            portletLayoutListener.onAddToLayout(
142                                                    portletId, themeDisplay.getPlid());
143                                    }
144    
145                                    PortletJSONUtil.populatePortletJSONObject(
146                                            request, StringPool.BLANK, portlet, jsonObject);
147                            }
148    
149                            PortletJSONUtil.writeHeaderPaths(response, jsonObject);
150    
151                            PortletContainerUtil.render(request, response, portlet);
152    
153                            PortletJSONUtil.writeFooterPaths(response, jsonObject);
154                    }
155                    finally {
156                            restrictPortletServletRequest.mergeSharedAttributes();
157                    }
158            }
159    
160            @Override
161            public int doEndTag() throws JspException {
162                    try {
163                            HttpServletRequest request =
164                                    (HttpServletRequest)pageContext.getRequest();
165    
166                            Layout layout = (Layout)request.getAttribute(WebKeys.LAYOUT);
167    
168                            if (layout == null) {
169                                    return EVAL_PAGE;
170                            }
171    
172                            HttpServletResponse response =
173                                    (HttpServletResponse)pageContext.getResponse();
174    
175                            doTag(
176                                    _portletName, _queryString, _defaultPreferences, pageContext,
177                                    request, response);
178    
179                            return EVAL_PAGE;
180                    }
181                    catch (Exception e) {
182                            _log.error(e, e);
183    
184                            throw new JspException(e);
185                    }
186            }
187    
188            public void setDefaultPreferences(String defaultPreferences) {
189                    _defaultPreferences = defaultPreferences;
190            }
191    
192            public void setPortletName(String portletName) {
193                    _portletName = portletName;
194            }
195    
196            public void setQueryString(String queryString) {
197                    _queryString = queryString;
198            }
199    
200            /**
201             * @see com.liferay.portal.model.impl.LayoutTypePortletImpl#getStaticPortlets(
202             *      String)
203             */
204            protected static Portlet getPortlet(long companyId, String portletId)
205                    throws Exception {
206    
207                    Portlet portlet = PortletLocalServiceUtil.getPortletById(
208                            companyId, portletId);
209    
210                    // See LayoutTypePortletImpl#getStaticPortlets for why we only clone
211                    // non-instanceable portlets
212    
213                    if (!portlet.isInstanceable()) {
214                            portlet = (Portlet)portlet.clone();
215                    }
216    
217                    portlet.setStatic(true);
218    
219                    return portlet;
220            }
221    
222            private static Log _log = LogFactoryUtil.getLog(RuntimeTag.class);
223    
224            private String _defaultPreferences;
225            private String _portletName;
226            private String _queryString;
227    
228    }