1
14
15 package com.liferay.portal.bean;
16
17 import com.liferay.portal.SystemException;
18 import com.liferay.portal.kernel.bean.BeanLocator;
19 import com.liferay.portal.kernel.bean.PortalBeanLocatorUtil;
20 import com.liferay.portal.kernel.bean.PortletBeanLocatorUtil;
21 import com.liferay.portal.kernel.bean.Renderer;
22 import com.liferay.portal.kernel.bean.RendererException;
23 import com.liferay.portal.kernel.io.unsync.UnsyncStringWriter;
24 import com.liferay.portal.kernel.log.Log;
25 import com.liferay.portal.kernel.log.LogFactoryUtil;
26 import com.liferay.portal.kernel.util.ParamUtil;
27 import com.liferay.portal.kernel.util.PropsUtil;
28 import com.liferay.portal.kernel.util.StringPool;
29 import com.liferay.portal.kernel.util.StringUtil;
30 import com.liferay.portal.kernel.util.Validator;
31 import com.liferay.portal.kernel.velocity.VelocityContext;
32 import com.liferay.portal.kernel.velocity.VelocityEngineUtil;
33 import com.liferay.portal.util.ContentUtil;
34 import com.liferay.portal.util.PortalUtil;
35 import com.liferay.portal.util.PrefsPropsUtil;
36 import com.liferay.portal.velocity.VelocityVariables;
37 import com.liferay.portlet.PortletPreferencesFactoryUtil;
38
39 import java.lang.reflect.Method;
40
41 import javax.portlet.PortletPreferences;
42 import javax.portlet.PortletRequest;
43 import javax.portlet.PortletResponse;
44
45 import javax.servlet.http.HttpServletRequest;
46 import javax.servlet.http.HttpServletResponse;
47
48 import org.springframework.beans.factory.NoSuchBeanDefinitionException;
49
50
55 public class RendererImpl implements Renderer {
56
57 public String renderBean(
58 HttpServletRequest request, HttpServletResponse response,
59 Object bean)
60 throws RendererException {
61
62 return renderBean(request, response, null, bean, null);
63 }
64
65 public String renderBean(
66 HttpServletRequest request, HttpServletResponse response,
67 Object bean, String varientSuffix)
68 throws RendererException {
69
70 return renderBean(request, response, null, bean, varientSuffix);
71 }
72
73 public String renderBean(
74 HttpServletRequest request, HttpServletResponse response,
75 String servletContextName, Object bean)
76 throws RendererException {
77
78 return renderBean(request, response, servletContextName, bean, null);
79 }
80
81 public String renderBean(
82 HttpServletRequest request, HttpServletResponse response,
83 String servletContextName, Object bean, String varientSuffix)
84 throws RendererException {
85
86 if (bean == null) {
87 return null;
88 }
89
90 long companyId = PortalUtil.getCompanyId(request);
91
92 String className = _normalizeClassName(bean.getClass().getName());
93
94 if (Validator.isNotNull(varientSuffix)) {
95 className = varientSuffix;
96 }
97
98 String velocityTemplateContent = null;
99
100 PortletPreferences preferences = _getPortletPreferences(request);
101
102 if (preferences != null) {
103 velocityTemplateContent = preferences.getValue(
104 RENDERER_TEMPLATE_PREFIX + className, StringPool.BLANK);
105 }
106
107 if (Validator.isNull(velocityTemplateContent) &&
108 Validator.isNotNull(servletContextName)) {
109
110 if (servletContextName.startsWith(StringPool.SLASH)) {
111 servletContextName = servletContextName.substring(1);
112 }
113
114 try {
115 BeanLocator beanLocator = PortletBeanLocatorUtil.getBeanLocator(
116 servletContextName);
117
118 velocityTemplateContent = ContentUtil.get(
119 beanLocator.getClassLoader(),
120 PropsUtil.get(RENDERER_TEMPLATE_PREFIX + className));
121 }
122 catch (Exception e) {
123 }
124 }
125
126 if (Validator.isNull(velocityTemplateContent)) {
127 try {
128 velocityTemplateContent = PrefsPropsUtil.getContent(
129 companyId, RENDERER_TEMPLATE_PREFIX + className);
130 }
131 catch (Exception e) {
132 }
133 }
134
135 if (Validator.isNull(velocityTemplateContent)) {
136 _log.warn(
137 "No entity renderer template found for " + className);
138
139 return null;
140 }
141
142 VelocityContext velocityContext =
143 VelocityEngineUtil.getWrappedStandardToolsContext();
144
145
147 VelocityVariables.insertVariables(velocityContext, request);
148
149 velocityContext.put(_BEAN, bean);
150
151 try {
152 UnsyncStringWriter unsyncStringWriter = new UnsyncStringWriter();
153
154 VelocityEngineUtil.mergeTemplate(
155 className, velocityTemplateContent, velocityContext,
156 unsyncStringWriter);
157
158 return unsyncStringWriter.toString();
159 }
160 catch (Exception e) {
161 _log.error(e, e);
162
163 throw new RendererException(e);
164 }
165 }
166
167 public String renderBean(
168 PortletRequest portletRequest, PortletResponse portletResponse,
169 Object bean)
170 throws RendererException {
171
172 return renderBean(portletRequest, portletResponse, null, bean, null);
173 }
174
175 public String renderBean(
176 PortletRequest portletRequest, PortletResponse portletResponse,
177 Object bean, String varientSuffix)
178 throws RendererException {
179
180 return renderBean(
181 portletRequest, portletResponse, null, bean, varientSuffix);
182 }
183
184 public String renderBean(
185 PortletRequest portletRequest, PortletResponse portletResponse,
186 String servletContextName, Object bean)
187 throws RendererException {
188
189 return renderBean(
190 portletRequest, portletResponse, servletContextName, bean, null);
191 }
192
193 public String renderBean(
194 PortletRequest portletRequest, PortletResponse portletResponse,
195 String servletContextName, Object bean, String varientSuffix)
196 throws RendererException {
197
198 HttpServletRequest request = PortalUtil.getHttpServletRequest(
199 portletRequest);
200 HttpServletResponse response = PortalUtil.getHttpServletResponse(
201 portletResponse);
202
203 return renderBean(
204 request, response, servletContextName, bean, varientSuffix);
205 }
206
207 public String renderEntity(
208 HttpServletRequest request, HttpServletResponse response,
209 String className, Object classPK)
210 throws RendererException {
211
212 return renderEntity(request, response, null, className, classPK, null);
213 }
214
215 public String renderEntity(
216 HttpServletRequest request, HttpServletResponse response,
217 String className, Object classPK, String varientSuffix)
218 throws RendererException {
219
220 return renderEntity(
221 request, response, null, className, classPK, varientSuffix);
222 }
223
224 public String renderEntity(
225 HttpServletRequest request, HttpServletResponse response,
226 String servletContextName, String className, Object classPK)
227 throws RendererException {
228
229 return renderEntity(
230 request, response, servletContextName, className, classPK, null);
231 }
232
233 public String renderEntity(
234 HttpServletRequest request, HttpServletResponse response,
235 String servletContextName, String className, Object classPK,
236 String varientSuffix)
237 throws RendererException {
238
239 if (Validator.isNull(className)) {
240 return null;
241 }
242
243 className = _normalizeClassName(className);
244
245 String[] beanNameParts = StringUtil.split(className, _MODEL);
246
247 Object serviceBean = null;
248
249 if (Validator.isNotNull(servletContextName)) {
250 if (servletContextName.startsWith(StringPool.SLASH)) {
251 servletContextName = servletContextName.substring(1);
252 }
253
254 try {
255 serviceBean = PortletBeanLocatorUtil.locate(
256 servletContextName,
257 beanNameParts[0] + _SERVICE + beanNameParts[1] +
258 _LOCAL_SERVICE_UTIL);
259 }
260 catch (NoSuchBeanDefinitionException nsbde) {
261 }
262 }
263 else {
264 try {
265 serviceBean = PortalBeanLocatorUtil.locate(
266 beanNameParts[0] + _SERVICE + beanNameParts[1] +
267 _LOCAL_SERVICE_UTIL);
268 }
269 catch (NoSuchBeanDefinitionException nsbde) {
270 }
271 }
272
273 Object bean = null;
274
275 if (serviceBean != null) {
276 Method getMethod = null;
277
278 try {
279 getMethod = serviceBean.getClass().getDeclaredMethod(
280 "get" + beanNameParts[1], classPK.getClass());
281 }
282 catch (Exception e) {
283 }
284
285 if (getMethod == null) {
286 try {
287 getMethod = serviceBean.getClass().getDeclaredMethod(
288 "get" + beanNameParts[1],
289 _mapToPrimitive(classPK.getClass()));
290 }
291 catch (Exception e) {
292 }
293 }
294
295 if (getMethod != null) {
296 try {
297 bean = getMethod.invoke(null, classPK);
298 }
299 catch (Exception e) {
300 _log.warn(e.getMessage());
301 }
302 }
303 }
304
305 return renderBean(
306 request, response, servletContextName, bean, varientSuffix);
307 }
308
309 public String renderEntity(
310 PortletRequest portletRequest, PortletResponse portletResponse,
311 String className, Object classPK)
312 throws RendererException {
313
314 return renderEntity(
315 portletRequest, portletResponse, null, className, classPK, null);
316 }
317
318 public String renderEntity(
319 PortletRequest portletRequest, PortletResponse portletResponse,
320 String className, Object classPK, String varientSuffix)
321 throws RendererException {
322
323 return renderEntity(
324 portletRequest, portletResponse, null, className, classPK,
325 varientSuffix);
326 }
327
328 public String renderEntity(
329 PortletRequest portletRequest, PortletResponse portletResponse,
330 String servletContextName, String className, Object classPK)
331 throws RendererException {
332
333 return renderEntity(
334 portletRequest, portletResponse, servletContextName, className,
335 classPK, null);
336 }
337
338 public String renderEntity(
339 PortletRequest portletRequest, PortletResponse portletResponse,
340 String servletContextName, String className, Object classPK,
341 String varientSuffix)
342 throws RendererException {
343
344 HttpServletRequest request = PortalUtil.getHttpServletRequest(
345 portletRequest);
346 HttpServletResponse response = PortalUtil.getHttpServletResponse(
347 portletResponse);
348
349 return renderEntity(
350 request, response, servletContextName, className, classPK,
351 varientSuffix);
352 }
353
354 protected PortletPreferences _getPortletPreferences(
355 HttpServletRequest request) {
356
357 PortletPreferences preferences = PortalUtil.getPreferences(request);
358
359 String portletResource = ParamUtil.getString(
360 request, "portletResource");
361
362 if (Validator.isNotNull(portletResource)) {
363 try {
364 preferences = PortletPreferencesFactoryUtil.getPortletSetup(
365 request, portletResource);
366 }
367 catch (SystemException se) {
368 }
369 }
370
371 return preferences;
372 }
373
374 protected Class<?> _mapToPrimitive(Class<?> clazz) {
375 Class<?> mapping = clazz;
376
377 if (clazz == Integer.class) {
378 mapping = int.class;
379 }
380 else if (clazz == Long.class) {
381 mapping = long.class;
382 }
383
384 return mapping;
385 }
386
387 protected String _normalizeClassName(String className) {
388 className = StringUtil.replace(
389 className,
390 new String[] {
391 ".impl.",
392 "Impl"
393 },
394 new String[] {
395 StringPool.PERIOD,
396 StringPool.BLANK
397 }
398 );
399
400 return className;
401 }
402
403 private static final String _BEAN = "bean";
404
405 private static final String _LOCAL_SERVICE_UTIL = "LocalServiceUtil";
406
407 private static final String _MODEL = ".model.";
408
409 private static final String _SERVICE = ".service.";
410
411 private static Log _log = LogFactoryUtil.getLog(RendererImpl.class);
412
413 }