001
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.util.MapUtil;
028 import com.liferay.portal.kernel.util.PrefixPredicateFilter;
029 import com.liferay.portal.kernel.util.StringPool;
030 import com.liferay.portal.kernel.util.WebKeys;
031 import com.liferay.portal.model.Layout;
032 import com.liferay.portal.model.LayoutTypePortlet;
033 import com.liferay.portal.model.Portlet;
034 import com.liferay.portal.service.PortletLocalServiceUtil;
035 import com.liferay.portal.service.PortletPreferencesLocalServiceUtil;
036 import com.liferay.portal.theme.ThemeDisplay;
037 import com.liferay.portal.util.PortletKeys;
038 import com.liferay.portlet.PortletPreferencesFactoryUtil;
039 import com.liferay.taglib.servlet.PipingServletResponse;
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
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
113
114
115 return;
116 }
117 }
118
119 Layout layout = themeDisplay.getLayout();
120
121 Portlet portlet = getPortlet(
122 themeDisplay.getCompanyId(), portletId);
123
124 if ((PortletPreferencesLocalServiceUtil.getPortletPreferencesCount(
125 PortletKeys.PREFS_OWNER_TYPE_LAYOUT, themeDisplay.getPlid(),
126 portletId) < 1) ||
127 layout.isTypeControlPanel() ||
128 layout.isTypePanel()) {
129
130 PortletPreferencesFactoryUtil.getLayoutPortletSetup(
131 layout, portletId);
132 PortletPreferencesFactoryUtil.getPortletSetup(
133 request, portletId, defaultPreferences);
134
135 PortletLayoutListener portletLayoutListener =
136 portlet.getPortletLayoutListenerInstance();
137
138 if (portletLayoutListener != null) {
139 portletLayoutListener.onAddToLayout(
140 portletId, themeDisplay.getPlid());
141 }
142 }
143
144 JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
145
146 PortletJSONUtil.populatePortletJSONObject(
147 request, StringPool.BLANK, portlet, jsonObject);
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
204 protected static Portlet getPortlet(long companyId, String portletId)
205 throws Exception {
206
207 Portlet portlet = PortletLocalServiceUtil.getPortletById(
208 companyId, portletId);
209
210
211
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 final Log _log = LogFactoryUtil.getLog(RuntimeTag.class);
223
224 private String _defaultPreferences;
225 private String _portletName;
226 private String _queryString;
227
228 }