001
014
015 package com.liferay.portal.layoutconfiguration.util.velocity;
016
017 import com.liferay.portal.kernel.exception.SystemException;
018 import com.liferay.portal.kernel.portlet.PortletContainerUtil;
019 import com.liferay.portal.kernel.servlet.BufferCacheServletResponse;
020 import com.liferay.portal.kernel.util.GetterUtil;
021 import com.liferay.portal.kernel.util.StringBundler;
022 import com.liferay.portal.kernel.util.StringPool;
023 import com.liferay.portal.kernel.util.Validator;
024 import com.liferay.portal.layoutconfiguration.util.PortletRenderer;
025 import com.liferay.portal.model.LayoutTypePortlet;
026 import com.liferay.portal.model.Portlet;
027 import com.liferay.portal.service.PortletLocalServiceUtil;
028 import com.liferay.portal.theme.ThemeDisplay;
029 import com.liferay.portal.util.WebKeys;
030
031 import java.util.ArrayList;
032 import java.util.Comparator;
033 import java.util.List;
034 import java.util.Map;
035 import java.util.TreeMap;
036
037 import javax.servlet.http.HttpServletRequest;
038 import javax.servlet.http.HttpServletResponse;
039
040
045 public class TemplateProcessor implements ColumnProcessor {
046
047 public TemplateProcessor(
048 HttpServletRequest request, HttpServletResponse response,
049 String portletId)
050 throws SystemException {
051
052 _request = request;
053 _response = response;
054
055 if (Validator.isNotNull(portletId)) {
056 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
057 WebKeys.THEME_DISPLAY);
058
059 _portlet = PortletLocalServiceUtil.getPortletById(
060 themeDisplay.getCompanyId(), portletId);
061 }
062
063 _portletAjaxRender = GetterUtil.getBoolean(
064 request.getAttribute(WebKeys.PORTLET_AJAX_RENDER));
065
066 _portletRenderers = new TreeMap<Integer, List<PortletRenderer>>(
067 _renderWeightComparator);
068 }
069
070 public Map<Integer, List<PortletRenderer>> getPortletRenderers() {
071 return _portletRenderers;
072 }
073
074 public boolean isPortletAjaxRender() {
075 return _portletAjaxRender;
076 }
077
078 @Override
079 public String processColumn(String columnId) throws Exception {
080 return processColumn(columnId, StringPool.BLANK);
081 }
082
083 @Override
084 public String processColumn(String columnId, String classNames)
085 throws Exception {
086
087 ThemeDisplay themeDisplay = (ThemeDisplay)_request.getAttribute(
088 WebKeys.THEME_DISPLAY);
089
090 LayoutTypePortlet layoutTypePortlet =
091 themeDisplay.getLayoutTypePortlet();
092
093 List<Portlet> portlets = layoutTypePortlet.getAllPortlets(columnId);
094
095 StringBundler sb = new StringBundler(portlets.size() + 11);
096
097 sb.append("<div class=\"");
098 sb.append("portlet-dropzone");
099
100 if (layoutTypePortlet.isCustomizable() &&
101 layoutTypePortlet.isColumnDisabled(columnId)) {
102
103 sb.append(" portlet-dropzone-disabled");
104 }
105
106 if (layoutTypePortlet.isColumnCustomizable(columnId)) {
107 sb.append(" customizable");
108 }
109
110 if (portlets.isEmpty()) {
111 sb.append(" empty");
112 }
113
114 if (Validator.isNotNull(classNames)) {
115 sb.append(" ");
116 sb.append(classNames);
117 }
118
119 sb.append("\" id=\"layout-column_");
120 sb.append(columnId);
121 sb.append("\">");
122
123 for (int i = 0; i < portlets.size(); i++) {
124 Portlet portlet = portlets.get(i);
125
126 Integer columnCount = new Integer(portlets.size());
127 Integer columnPos = new Integer(i);
128
129 PortletRenderer portletRenderer = new PortletRenderer(
130 portlet, columnId, columnCount, columnPos);
131
132 if (_portletAjaxRender && (portlet.getRenderWeight() < 1)) {
133 StringBundler renderResult = portletRenderer.renderAjax(
134 _request, _response);
135
136 sb.append(renderResult);
137 }
138 else {
139 Integer renderWeight = portlet.getRenderWeight();
140
141 List<PortletRenderer> portletRenderers = _portletRenderers.get(
142 renderWeight);
143
144 if (portletRenderers == null) {
145 portletRenderers = new ArrayList<PortletRenderer>();
146
147 _portletRenderers.put(renderWeight, portletRenderers);
148 }
149
150 portletRenderers.add(portletRenderer);
151
152 sb.append("[$TEMPLATE_PORTLET_");
153 sb.append(portlet.getPortletId());
154 sb.append("$]");
155 }
156 }
157
158 sb.append("</div>");
159
160 return sb.toString();
161 }
162
163 @Override
164 public String processMax() throws Exception {
165 BufferCacheServletResponse bufferCacheServletResponse =
166 new BufferCacheServletResponse(_response);
167
168 PortletContainerUtil.render(
169 _request, bufferCacheServletResponse, _portlet);
170
171 return bufferCacheServletResponse.getString();
172 }
173
174 @Override
175 public String processPortlet(String portletId) throws Exception {
176 _request.setAttribute(WebKeys.RENDER_PORTLET_RESOURCE, Boolean.TRUE);
177
178 BufferCacheServletResponse bufferCacheServletResponse =
179 new BufferCacheServletResponse(_response);
180
181 ThemeDisplay themeDisplay = (ThemeDisplay)_request.getAttribute(
182 WebKeys.THEME_DISPLAY);
183
184 Portlet portlet = PortletLocalServiceUtil.getPortletById(
185 themeDisplay.getCompanyId(), portletId);
186
187 try {
188 PortletContainerUtil.render(
189 _request, bufferCacheServletResponse, portlet);
190
191 return bufferCacheServletResponse.getString();
192 }
193 finally {
194 _request.removeAttribute(WebKeys.RENDER_PORTLET_RESOURCE);
195 }
196 }
197
198 private static RenderWeightComparator _renderWeightComparator =
199 new RenderWeightComparator();
200
201 private Portlet _portlet;
202 private boolean _portletAjaxRender;
203 private Map<Integer, List<PortletRenderer>> _portletRenderers;
204 private HttpServletRequest _request;
205 private HttpServletResponse _response;
206
207 private static class RenderWeightComparator implements Comparator<Integer> {
208
209 @Override
210 public int compare(Integer renderWeight1, Integer renderWeight2) {
211 return renderWeight2.intValue() - renderWeight1.intValue();
212 }
213
214 }
215
216 }