001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
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    /**
043     * @author Raymond Aug??
044     */
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                            // Check to see if an instance of this portlet is already in the
071                            // layout, but ignore the portlet that was just added
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                    // Workaround for portlet#getRootPortletId because that does not return
261                    // the proper root portlet ID for OpenSocial and WSRP portlets
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    }