001
014
015 package com.liferay.portal.kernel.portlet;
016
017 import com.liferay.portal.kernel.json.JSONArray;
018 import com.liferay.portal.kernel.json.JSONFactoryUtil;
019 import com.liferay.portal.kernel.json.JSONObject;
020 import com.liferay.portal.kernel.util.HtmlUtil;
021 import com.liferay.portal.kernel.util.HttpUtil;
022 import com.liferay.portal.kernel.util.StringPool;
023 import com.liferay.portal.kernel.util.StringUtil;
024 import com.liferay.portal.kernel.util.WebKeys;
025 import com.liferay.portal.model.LayoutTypePortlet;
026 import com.liferay.portal.model.Portlet;
027 import com.liferay.portal.theme.ThemeDisplay;
028 import com.liferay.portal.util.PortalUtil;
029
030 import java.io.IOException;
031 import java.io.PrintWriter;
032
033 import java.util.LinkedHashSet;
034 import java.util.List;
035 import java.util.Set;
036
037 import javax.portlet.MimeResponse;
038
039 import javax.servlet.http.HttpServletRequest;
040 import javax.servlet.http.HttpServletResponse;
041
042
045 public class PortletJSONUtil {
046
047 public static void populatePortletJSONObject(
048 HttpServletRequest request, String portletHTML, Portlet portlet,
049 JSONObject jsonObject)
050 throws Exception {
051
052 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
053 WebKeys.THEME_DISPLAY);
054
055 Set<String> footerCssSet = new LinkedHashSet<String>();
056 Set<String> footerJavaScriptSet = new LinkedHashSet<String>();
057 Set<String> headerCssSet = new LinkedHashSet<String>();
058 Set<String> headerJavaScriptSet = new LinkedHashSet<String>();
059
060 boolean portletOnLayout = false;
061
062 String rootPortletId = _getRootPortletId(portlet);
063 String portletId = portlet.getPortletId();
064
065 LayoutTypePortlet layoutTypePortlet =
066 themeDisplay.getLayoutTypePortlet();
067
068 for (Portlet layoutPortlet : layoutTypePortlet.getAllPortlets()) {
069
070
071
072
073 String layoutPortletRootPortletId = _getRootPortletId(
074 layoutPortlet);
075
076 if (rootPortletId.equals(layoutPortletRootPortletId) &&
077 !portletId.equals(layoutPortlet.getPortletId())) {
078
079 portletOnLayout = true;
080
081 break;
082 }
083 }
084
085 if (!portletOnLayout && portlet.isAjaxable()) {
086 Portlet rootPortlet = portlet.getRootPortlet();
087
088 for (String footerPortalCss : portlet.getFooterPortalCss()) {
089 if (!HttpUtil.hasProtocol(footerPortalCss)) {
090 footerPortalCss =
091 PortalUtil.getPathContext() + footerPortalCss;
092
093 footerPortalCss = PortalUtil.getStaticResourceURL(
094 request, footerPortalCss, rootPortlet.getTimestamp());
095 }
096
097 footerCssSet.add(footerPortalCss);
098 }
099
100 for (String footerPortalJavaScript :
101 portlet.getFooterPortalJavaScript()) {
102
103 if (!HttpUtil.hasProtocol(footerPortalJavaScript)) {
104 footerPortalJavaScript =
105 PortalUtil.getPathContext() + footerPortalJavaScript;
106
107 footerPortalJavaScript = PortalUtil.getStaticResourceURL(
108 request, footerPortalJavaScript,
109 rootPortlet.getTimestamp());
110 }
111
112 footerJavaScriptSet.add(footerPortalJavaScript);
113 }
114
115 for (String footerPortletCss : portlet.getFooterPortletCss()) {
116 if (!HttpUtil.hasProtocol(footerPortletCss)) {
117 footerPortletCss =
118 portlet.getStaticResourcePath() + footerPortletCss;
119
120 footerPortletCss = PortalUtil.getStaticResourceURL(
121 request, footerPortletCss, rootPortlet.getTimestamp());
122 }
123
124 footerCssSet.add(footerPortletCss);
125 }
126
127 for (String footerPortletJavaScript :
128 portlet.getFooterPortletJavaScript()) {
129
130 if (!HttpUtil.hasProtocol(footerPortletJavaScript)) {
131 footerPortletJavaScript =
132 portlet.getStaticResourcePath() +
133 footerPortletJavaScript;
134
135 footerPortletJavaScript = PortalUtil.getStaticResourceURL(
136 request, footerPortletJavaScript,
137 rootPortlet.getTimestamp());
138 }
139
140 footerJavaScriptSet.add(footerPortletJavaScript);
141 }
142
143 for (String headerPortalCss : portlet.getHeaderPortalCss()) {
144 if (!HttpUtil.hasProtocol(headerPortalCss)) {
145 headerPortalCss =
146 PortalUtil.getPathContext() + headerPortalCss;
147
148 headerPortalCss = PortalUtil.getStaticResourceURL(
149 request, headerPortalCss, rootPortlet.getTimestamp());
150 }
151
152 headerCssSet.add(headerPortalCss);
153 }
154
155 for (String headerPortalJavaScript :
156 portlet.getHeaderPortalJavaScript()) {
157
158 if (!HttpUtil.hasProtocol(headerPortalJavaScript)) {
159 headerPortalJavaScript =
160 PortalUtil.getPathContext() + headerPortalJavaScript;
161
162 headerPortalJavaScript = PortalUtil.getStaticResourceURL(
163 request, headerPortalJavaScript,
164 rootPortlet.getTimestamp());
165 }
166
167 headerJavaScriptSet.add(headerPortalJavaScript);
168 }
169
170 for (String headerPortletCss : portlet.getHeaderPortletCss()) {
171 if (!HttpUtil.hasProtocol(headerPortletCss)) {
172 headerPortletCss =
173 portlet.getStaticResourcePath() + headerPortletCss;
174
175 headerPortletCss = PortalUtil.getStaticResourceURL(
176 request, headerPortletCss, rootPortlet.getTimestamp());
177 }
178
179 headerCssSet.add(headerPortletCss);
180 }
181
182 for (String headerPortletJavaScript :
183 portlet.getHeaderPortletJavaScript()) {
184
185 if (!HttpUtil.hasProtocol(headerPortletJavaScript)) {
186 headerPortletJavaScript =
187 portlet.getStaticResourcePath() +
188 headerPortletJavaScript;
189
190 headerPortletJavaScript = PortalUtil.getStaticResourceURL(
191 request, headerPortletJavaScript,
192 rootPortlet.getTimestamp());
193 }
194
195 headerJavaScriptSet.add(headerPortletJavaScript);
196 }
197 }
198
199 String footerCssPaths = JSONFactoryUtil.serialize(
200 footerCssSet.toArray(new String[footerCssSet.size()]));
201
202 jsonObject.put(
203 "footerCssPaths", JSONFactoryUtil.createJSONArray(footerCssPaths));
204
205 String footerJavaScriptPaths = JSONFactoryUtil.serialize(
206 footerJavaScriptSet.toArray(
207 new String[footerJavaScriptSet.size()]));
208
209 jsonObject.put(
210 "footerJavaScriptPaths",
211 JSONFactoryUtil.createJSONArray(footerJavaScriptPaths));
212
213 String headerCssPaths = JSONFactoryUtil.serialize(
214 headerCssSet.toArray(new String[headerCssSet.size()]));
215
216 jsonObject.put(
217 "headerCssPaths", JSONFactoryUtil.createJSONArray(headerCssPaths));
218
219 String headerJavaScriptPaths = JSONFactoryUtil.serialize(
220 headerJavaScriptSet.toArray(
221 new String[headerJavaScriptSet.size()]));
222
223 jsonObject.put(
224 "headerJavaScriptPaths",
225 JSONFactoryUtil.createJSONArray(headerJavaScriptPaths));
226
227 List<String> markupHeadElements = (List<String>)request.getAttribute(
228 MimeResponse.MARKUP_HEAD_ELEMENT);
229
230 if (markupHeadElements != null) {
231 jsonObject.put(
232 "markupHeadElements",
233 StringUtil.merge(markupHeadElements, StringPool.BLANK));
234 }
235
236 jsonObject.put("portletHTML", portletHTML);
237 jsonObject.put("refresh", !portlet.isAjaxable());
238 }
239
240 public static void writeFooterPaths(
241 HttpServletResponse response, JSONObject jsonObject)
242 throws IOException {
243
244 _writePaths(
245 response, jsonObject.getJSONArray("footerCssPaths"),
246 jsonObject.getJSONArray("footerJavaScriptPaths"));
247 }
248
249 public static void writeHeaderPaths(
250 HttpServletResponse response, JSONObject jsonObject)
251 throws IOException {
252
253 _writePaths(
254 response, jsonObject.getJSONArray("headerCssPaths"),
255 jsonObject.getJSONArray("headerJavaScriptPaths"));
256 }
257
258 private static String _getRootPortletId(Portlet portlet) {
259
260
261
262
263 Portlet rootPortlet = portlet.getRootPortlet();
264
265 return rootPortlet.getPortletId();
266 }
267
268 private static void _writePaths(
269 HttpServletResponse response, JSONArray cssPathsJSONArray,
270 JSONArray javaScriptPathsJSONArray)
271 throws IOException {
272
273 if ((cssPathsJSONArray.length() == 0) &&
274 (javaScriptPathsJSONArray.length() == 0)) {
275
276 return;
277 }
278
279 PrintWriter printWriter = response.getWriter();
280
281 for (int i = 0; i < cssPathsJSONArray.length(); i++) {
282 String value = cssPathsJSONArray.getString(i);
283
284 printWriter.print("<link href=\"");
285 printWriter.print(HtmlUtil.escape(value));
286 printWriter.println("\" rel=\"stylesheet\" type=\"text/css\" />");
287 }
288
289 for (int i = 0; i < javaScriptPathsJSONArray.length(); i++) {
290 String value = javaScriptPathsJSONArray.getString(i);
291
292 printWriter.print("<script src=\"");
293 printWriter.print(HtmlUtil.escape(value));
294 printWriter.println("\" type=\"text/javascript\"></script>");
295 }
296 }
297
298 }