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