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 new Comparator<Integer>() {
068
069 @Override
070 public int compare(
071 Integer renderWeight1, Integer renderWeight2) {
072
073 return renderWeight2.compareTo(renderWeight1);
074 }
075
076 });
077 }
078
079 public Map<Integer, List<PortletRenderer>> getPortletRenderers() {
080 return _portletRenderers;
081 }
082
083 public boolean isPortletAjaxRender() {
084 return _portletAjaxRender;
085 }
086
087 @Override
088 public String processColumn(String columnId) throws Exception {
089 return processColumn(columnId, StringPool.BLANK);
090 }
091
092 @Override
093 public String processColumn(String columnId, String classNames)
094 throws Exception {
095
096 ThemeDisplay themeDisplay = (ThemeDisplay)_request.getAttribute(
097 WebKeys.THEME_DISPLAY);
098
099 LayoutTypePortlet layoutTypePortlet =
100 themeDisplay.getLayoutTypePortlet();
101
102 List<Portlet> portlets = layoutTypePortlet.getAllPortlets(columnId);
103
104 StringBundler sb = new StringBundler(portlets.size() + 11);
105
106 sb.append("<div class=\"");
107 sb.append("portlet-dropzone");
108
109 if (layoutTypePortlet.isCustomizable() &&
110 layoutTypePortlet.isColumnDisabled(columnId)) {
111
112 sb.append(" portlet-dropzone-disabled");
113 }
114
115 if (layoutTypePortlet.isColumnCustomizable(columnId)) {
116 sb.append(" customizable");
117 }
118
119 if (portlets.isEmpty()) {
120 sb.append(" empty");
121 }
122
123 if (Validator.isNotNull(classNames)) {
124 sb.append(" ");
125 sb.append(classNames);
126 }
127
128 sb.append("\" id=\"layout-column_");
129 sb.append(columnId);
130 sb.append("\">");
131
132 for (int i = 0; i < portlets.size(); i++) {
133 Portlet portlet = portlets.get(i);
134
135 Integer columnCount = new Integer(portlets.size());
136 Integer columnPos = new Integer(i);
137
138 PortletRenderer portletRenderer = new PortletRenderer(
139 portlet, columnId, columnCount, columnPos);
140
141 if (_portletAjaxRender && (portlet.getRenderWeight() < 1)) {
142 StringBundler renderResult = portletRenderer.renderAjax(
143 _request, _response);
144
145 sb.append(renderResult);
146 }
147 else {
148 Integer renderWeight = portlet.getRenderWeight();
149
150 List<PortletRenderer> portletRenderers = _portletRenderers.get(
151 renderWeight);
152
153 if (portletRenderers == null) {
154 portletRenderers = new ArrayList<PortletRenderer>();
155
156 _portletRenderers.put(renderWeight, portletRenderers);
157 }
158
159 portletRenderers.add(portletRenderer);
160
161 sb.append("[$TEMPLATE_PORTLET_");
162 sb.append(portlet.getPortletId());
163 sb.append("$]");
164 }
165 }
166
167 sb.append("</div>");
168
169 return sb.toString();
170 }
171
172 @Override
173 public String processMax() throws Exception {
174 BufferCacheServletResponse bufferCacheServletResponse =
175 new BufferCacheServletResponse(_response);
176
177 PortletContainerUtil.render(
178 _request, bufferCacheServletResponse, _portlet);
179
180 return bufferCacheServletResponse.getString();
181 }
182
183 @Override
184 public String processPortlet(String portletId) throws Exception {
185 _request.setAttribute(WebKeys.RENDER_PORTLET_RESOURCE, Boolean.TRUE);
186
187 BufferCacheServletResponse bufferCacheServletResponse =
188 new BufferCacheServletResponse(_response);
189
190 ThemeDisplay themeDisplay = (ThemeDisplay)_request.getAttribute(
191 WebKeys.THEME_DISPLAY);
192
193 Portlet portlet = PortletLocalServiceUtil.getPortletById(
194 themeDisplay.getCompanyId(), portletId);
195
196 try {
197 PortletContainerUtil.render(
198 _request, bufferCacheServletResponse, portlet);
199
200 return bufferCacheServletResponse.getString();
201 }
202 finally {
203 _request.removeAttribute(WebKeys.RENDER_PORTLET_RESOURCE);
204 }
205 }
206
207 private Portlet _portlet;
208 private boolean _portletAjaxRender;
209 private Map<Integer, List<PortletRenderer>> _portletRenderers;
210 private HttpServletRequest _request;
211 private HttpServletResponse _response;
212
213 }