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