/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.kernel.portlet;
import com.liferay.portal.kernel.json.JSONArray;
import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.model.LayoutTypePortlet;
import com.liferay.portal.kernel.model.Portlet;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.HtmlUtil;
import com.liferay.portal.kernel.util.HttpUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.WebKeys;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import javax.portlet.MimeResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author Raymond Augé
*/
public class PortletJSONUtil {
public static void populatePortletJSONObject(
HttpServletRequest request, String portletHTML, Portlet portlet,
JSONObject jsonObject)
throws Exception {
ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
WebKeys.THEME_DISPLAY);
Set<String> footerCssSet = new LinkedHashSet<>();
Set<String> footerJavaScriptSet = new LinkedHashSet<>();
Set<String> headerCssSet = new LinkedHashSet<>();
Set<String> headerJavaScriptSet = new LinkedHashSet<>();
boolean portletOnLayout = false;
String rootPortletId = _getRootPortletId(portlet);
String portletId = portlet.getPortletId();
LayoutTypePortlet layoutTypePortlet =
themeDisplay.getLayoutTypePortlet();
for (Portlet layoutPortlet : layoutTypePortlet.getAllPortlets()) {
// Check to see if an instance of this portlet is already in the
// layout, but ignore the portlet that was just added
String layoutPortletRootPortletId = _getRootPortletId(
layoutPortlet);
if (rootPortletId.equals(layoutPortletRootPortletId) &&
!portletId.equals(layoutPortlet.getPortletId())) {
portletOnLayout = true;
break;
}
}
if (!portletOnLayout && portlet.isAjaxable()) {
Portlet rootPortlet = portlet.getRootPortlet();
for (String footerPortalCss : portlet.getFooterPortalCss()) {
if (!HttpUtil.hasProtocol(footerPortalCss)) {
footerPortalCss =
PortalUtil.getPathContext() + footerPortalCss;
footerPortalCss = PortalUtil.getStaticResourceURL(
request, footerPortalCss, rootPortlet.getTimestamp());
}
footerCssSet.add(footerPortalCss);
}
for (String footerPortalJavaScript :
portlet.getFooterPortalJavaScript()) {
if (!HttpUtil.hasProtocol(footerPortalJavaScript)) {
footerPortalJavaScript =
PortalUtil.getPathContext() + footerPortalJavaScript;
footerPortalJavaScript = PortalUtil.getStaticResourceURL(
request, footerPortalJavaScript,
rootPortlet.getTimestamp());
}
footerJavaScriptSet.add(footerPortalJavaScript);
}
for (String footerPortletCss : portlet.getFooterPortletCss()) {
if (!HttpUtil.hasProtocol(footerPortletCss)) {
footerPortletCss =
portlet.getStaticResourcePath() + footerPortletCss;
footerPortletCss = PortalUtil.getStaticResourceURL(
request, footerPortletCss, rootPortlet.getTimestamp());
}
footerCssSet.add(footerPortletCss);
}
for (String footerPortletJavaScript :
portlet.getFooterPortletJavaScript()) {
if (!HttpUtil.hasProtocol(footerPortletJavaScript)) {
footerPortletJavaScript =
portlet.getStaticResourcePath() +
footerPortletJavaScript;
footerPortletJavaScript = PortalUtil.getStaticResourceURL(
request, footerPortletJavaScript,
rootPortlet.getTimestamp());
}
footerJavaScriptSet.add(footerPortletJavaScript);
}
for (String headerPortalCss : portlet.getHeaderPortalCss()) {
if (!HttpUtil.hasProtocol(headerPortalCss)) {
headerPortalCss =
PortalUtil.getPathContext() + headerPortalCss;
headerPortalCss = PortalUtil.getStaticResourceURL(
request, headerPortalCss, rootPortlet.getTimestamp());
}
headerCssSet.add(headerPortalCss);
}
for (String headerPortalJavaScript :
portlet.getHeaderPortalJavaScript()) {
if (!HttpUtil.hasProtocol(headerPortalJavaScript)) {
headerPortalJavaScript =
PortalUtil.getPathContext() + headerPortalJavaScript;
headerPortalJavaScript = PortalUtil.getStaticResourceURL(
request, headerPortalJavaScript,
rootPortlet.getTimestamp());
}
headerJavaScriptSet.add(headerPortalJavaScript);
}
for (String headerPortletCss : portlet.getHeaderPortletCss()) {
if (!HttpUtil.hasProtocol(headerPortletCss)) {
headerPortletCss =
portlet.getStaticResourcePath() + headerPortletCss;
headerPortletCss = PortalUtil.getStaticResourceURL(
request, headerPortletCss, rootPortlet.getTimestamp());
}
headerCssSet.add(headerPortletCss);
}
for (String headerPortletJavaScript :
portlet.getHeaderPortletJavaScript()) {
if (!HttpUtil.hasProtocol(headerPortletJavaScript)) {
headerPortletJavaScript =
portlet.getStaticResourcePath() +
headerPortletJavaScript;
headerPortletJavaScript = PortalUtil.getStaticResourceURL(
request, headerPortletJavaScript,
rootPortlet.getTimestamp());
}
headerJavaScriptSet.add(headerPortletJavaScript);
}
}
String footerCssPaths = JSONFactoryUtil.serialize(
footerCssSet.toArray(new String[footerCssSet.size()]));
jsonObject.put(
"footerCssPaths", JSONFactoryUtil.createJSONArray(footerCssPaths));
String footerJavaScriptPaths = JSONFactoryUtil.serialize(
footerJavaScriptSet.toArray(
new String[footerJavaScriptSet.size()]));
jsonObject.put(
"footerJavaScriptPaths",
JSONFactoryUtil.createJSONArray(footerJavaScriptPaths));
String headerCssPaths = JSONFactoryUtil.serialize(
headerCssSet.toArray(new String[headerCssSet.size()]));
jsonObject.put(
"headerCssPaths", JSONFactoryUtil.createJSONArray(headerCssPaths));
String headerJavaScriptPaths = JSONFactoryUtil.serialize(
headerJavaScriptSet.toArray(
new String[headerJavaScriptSet.size()]));
jsonObject.put(
"headerJavaScriptPaths",
JSONFactoryUtil.createJSONArray(headerJavaScriptPaths));
List<String> markupHeadElements = (List<String>)request.getAttribute(
MimeResponse.MARKUP_HEAD_ELEMENT);
if (markupHeadElements != null) {
jsonObject.put(
"markupHeadElements",
StringUtil.merge(markupHeadElements, StringPool.BLANK));
}
jsonObject.put("portletHTML", portletHTML);
jsonObject.put("refresh", !portlet.isAjaxable());
}
public static void writeFooterPaths(
HttpServletResponse response, JSONObject jsonObject)
throws IOException {
_writePaths(
response, jsonObject.getJSONArray("footerCssPaths"),
jsonObject.getJSONArray("footerJavaScriptPaths"));
}
public static void writeHeaderPaths(
HttpServletResponse response, JSONObject jsonObject)
throws IOException {
_writePaths(
response, jsonObject.getJSONArray("headerCssPaths"),
jsonObject.getJSONArray("headerJavaScriptPaths"));
}
private static String _getRootPortletId(Portlet portlet) {
// Workaround for portlet#getRootPortletId because that does not return
// the proper root portlet ID for OpenSocial and WSRP portlets
Portlet rootPortlet = portlet.getRootPortlet();
return rootPortlet.getPortletId();
}
private static void _writePaths(
HttpServletResponse response, JSONArray cssPathsJSONArray,
JSONArray javaScriptPathsJSONArray)
throws IOException {
if ((cssPathsJSONArray.length() == 0) &&
(javaScriptPathsJSONArray.length() == 0)) {
return;
}
PrintWriter printWriter = response.getWriter();
for (int i = 0; i < cssPathsJSONArray.length(); i++) {
String value = cssPathsJSONArray.getString(i);
printWriter.print("<link href=\"");
printWriter.print(HtmlUtil.escape(value));
printWriter.println("\" rel=\"stylesheet\" type=\"text/css\" />");
}
for (int i = 0; i < javaScriptPathsJSONArray.length(); i++) {
String value = javaScriptPathsJSONArray.getString(i);
printWriter.print("<script src=\"");
printWriter.print(HtmlUtil.escape(value));
printWriter.println("\" type=\"text/javascript\"></script>");
}
}
}