001
014
015 package com.liferay.portal.layoutconfiguration.util.velocity;
016
017 import com.liferay.portal.kernel.json.JSONFactoryUtil;
018 import com.liferay.portal.kernel.json.JSONObject;
019 import com.liferay.portal.kernel.model.LayoutTypePortlet;
020 import com.liferay.portal.kernel.model.Portlet;
021 import com.liferay.portal.kernel.portlet.PortletContainerUtil;
022 import com.liferay.portal.kernel.portlet.PortletJSONUtil;
023 import com.liferay.portal.kernel.portlet.PortletProvider;
024 import com.liferay.portal.kernel.portlet.PortletProviderUtil;
025 import com.liferay.portal.kernel.service.PortletLocalServiceUtil;
026 import com.liferay.portal.kernel.servlet.BufferCacheServletResponse;
027 import com.liferay.portal.kernel.settings.ModifiableSettings;
028 import com.liferay.portal.kernel.settings.PortletInstanceSettingsLocator;
029 import com.liferay.portal.kernel.settings.Settings;
030 import com.liferay.portal.kernel.settings.SettingsFactoryUtil;
031 import com.liferay.portal.kernel.theme.ThemeDisplay;
032 import com.liferay.portal.kernel.util.ClassUtil;
033 import com.liferay.portal.kernel.util.GetterUtil;
034 import com.liferay.portal.kernel.util.StringBundler;
035 import com.liferay.portal.kernel.util.StringPool;
036 import com.liferay.portal.kernel.util.Validator;
037 import com.liferay.portal.kernel.util.WebKeys;
038 import com.liferay.portal.layoutconfiguration.util.PortletRenderer;
039
040 import java.util.ArrayList;
041 import java.util.Comparator;
042 import java.util.List;
043 import java.util.Map;
044 import java.util.TreeMap;
045
046 import javax.servlet.http.HttpServletRequest;
047 import javax.servlet.http.HttpServletResponse;
048
049
055 public class TemplateProcessor implements ColumnProcessor {
056
057 public TemplateProcessor(
058 HttpServletRequest request, HttpServletResponse response,
059 String portletId) {
060
061 _request = request;
062 _response = response;
063
064 if (Validator.isNotNull(portletId)) {
065 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
066 WebKeys.THEME_DISPLAY);
067
068 _portlet = PortletLocalServiceUtil.getPortletById(
069 themeDisplay.getCompanyId(), portletId);
070 }
071 else {
072 _portlet = null;
073 }
074
075 _portletAjaxRender = GetterUtil.getBoolean(
076 request.getAttribute(WebKeys.PORTLET_AJAX_RENDER));
077
078 _portletRenderers = new TreeMap<>(_renderWeightComparator);
079 }
080
081 public Map<Integer, List<PortletRenderer>> getPortletRenderers() {
082 return _portletRenderers;
083 }
084
085 public boolean isPortletAjaxRender() {
086 return _portletAjaxRender;
087 }
088
089 @Override
090 public String processColumn(String columnId) throws Exception {
091 return processColumn(columnId, StringPool.BLANK);
092 }
093
094 @Override
095 public String processColumn(String columnId, String classNames)
096 throws Exception {
097
098 ThemeDisplay themeDisplay = (ThemeDisplay)_request.getAttribute(
099 WebKeys.THEME_DISPLAY);
100
101 LayoutTypePortlet layoutTypePortlet =
102 themeDisplay.getLayoutTypePortlet();
103
104 List<Portlet> portlets = layoutTypePortlet.getAllPortlets(columnId);
105
106 StringBundler sb = new StringBundler(portlets.size() * 3 + 10);
107
108 sb.append("<div class=\"portlet-dropzone");
109
110 if (layoutTypePortlet.isCustomizable() &&
111 layoutTypePortlet.isColumnDisabled(columnId)) {
112
113 sb.append(" portlet-dropzone-disabled");
114 }
115
116 if (layoutTypePortlet.isColumnCustomizable(columnId)) {
117 sb.append(" customizable");
118 }
119
120 if (portlets.isEmpty()) {
121 sb.append(" empty");
122 }
123
124 if (Validator.isNotNull(classNames)) {
125 sb.append(" ");
126 sb.append(classNames);
127 }
128
129 sb.append("\" id=\"layout-column_");
130 sb.append(columnId);
131 sb.append("\">");
132
133 for (int i = 0; i < portlets.size(); i++) {
134 Portlet portlet = portlets.get(i);
135
136 Integer columnCount = Integer.valueOf(portlets.size());
137 Integer columnPos = Integer.valueOf(i);
138
139 PortletRenderer portletRenderer = new PortletRenderer(
140 portlet, columnId, columnCount, columnPos);
141
142 if (_portletAjaxRender && (portlet.getRenderWeight() < 1)) {
143 StringBundler renderResult = portletRenderer.renderAjax(
144 _request, _response);
145
146 sb.append(renderResult);
147 }
148 else {
149 Integer renderWeight = portlet.getRenderWeight();
150
151 List<PortletRenderer> portletRenderers = _portletRenderers.get(
152 renderWeight);
153
154 if (portletRenderers == null) {
155 portletRenderers = new ArrayList<>();
156
157 _portletRenderers.put(renderWeight, portletRenderers);
158 }
159
160 portletRenderers.add(portletRenderer);
161
162 sb.append("[$TEMPLATE_PORTLET_");
163 sb.append(portlet.getPortletId());
164 sb.append("$]");
165 }
166 }
167
168 sb.append("</div>");
169
170 return sb.toString();
171 }
172
173 @Override
174 public String processMax() throws Exception {
175 BufferCacheServletResponse bufferCacheServletResponse =
176 new BufferCacheServletResponse(_response);
177
178 PortletContainerUtil.render(
179 _request, bufferCacheServletResponse, _portlet);
180
181 return bufferCacheServletResponse.getString();
182 }
183
184 @Override
185 public String processPortlet(String portletId) throws Exception {
186 _request.setAttribute(WebKeys.RENDER_PORTLET_RESOURCE, Boolean.TRUE);
187
188 BufferCacheServletResponse bufferCacheServletResponse =
189 new BufferCacheServletResponse(_response);
190
191 ThemeDisplay themeDisplay = (ThemeDisplay)_request.getAttribute(
192 WebKeys.THEME_DISPLAY);
193
194 Portlet portlet = PortletLocalServiceUtil.getPortletById(
195 themeDisplay.getCompanyId(), portletId);
196
197 JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
198
199 PortletJSONUtil.populatePortletJSONObject(
200 _request, StringPool.BLANK, portlet, jsonObject);
201
202 try {
203 PortletJSONUtil.writeHeaderPaths(_response, jsonObject);
204
205 PortletContainerUtil.render(
206 _request, bufferCacheServletResponse, portlet);
207
208 PortletJSONUtil.writeFooterPaths(_response, jsonObject);
209
210 return bufferCacheServletResponse.getString();
211 }
212 finally {
213 _request.removeAttribute(WebKeys.RENDER_PORTLET_RESOURCE);
214 }
215 }
216
217 @Override
218 public String processPortlet(
219 String portletId, Map<String, ?> defaultSettingsMap)
220 throws Exception {
221
222 ThemeDisplay themeDisplay = (ThemeDisplay)_request.getAttribute(
223 WebKeys.THEME_DISPLAY);
224
225 Settings settings = SettingsFactoryUtil.getSettings(
226 new PortletInstanceSettingsLocator(
227 themeDisplay.getLayout(), portletId));
228
229 ModifiableSettings modifiableSettings =
230 settings.getModifiableSettings();
231
232 for (Map.Entry<String, ?> entry : defaultSettingsMap.entrySet()) {
233 String key = entry.getKey();
234 Object value = entry.getValue();
235
236 if (value instanceof String) {
237 modifiableSettings.setValue(key, (String)value);
238 }
239 else if (value instanceof String[]) {
240 modifiableSettings.setValues(key, (String[])value);
241 }
242 else {
243 throw new IllegalArgumentException(
244 "Key " + key + " has unsupported value of type " +
245 ClassUtil.getClassName(value.getClass()));
246 }
247 }
248
249 modifiableSettings.store();
250
251 return processPortlet(portletId);
252 }
253
254 @Override
255 public String processPortlet(
256 String portletProviderClassName,
257 PortletProvider.Action portletProviderAction)
258 throws Exception {
259
260 String portletId = PortletProviderUtil.getPortletId(
261 portletProviderClassName, portletProviderAction);
262
263 return processPortlet(portletId);
264 }
265
266 private static final RenderWeightComparator _renderWeightComparator =
267 new RenderWeightComparator();
268
269 private final Portlet _portlet;
270 private final boolean _portletAjaxRender;
271 private final Map<Integer, List<PortletRenderer>> _portletRenderers;
272 private final HttpServletRequest _request;
273 private final HttpServletResponse _response;
274
275 private static class RenderWeightComparator implements Comparator<Integer> {
276
277 @Override
278 public int compare(Integer renderWeight1, Integer renderWeight2) {
279 return renderWeight2.intValue() - renderWeight1.intValue();
280 }
281
282 }
283
284 }