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.PortalBeanLocatorUtil;
19  import com.liferay.portal.kernel.bean.PortletBeanLocatorUtil;
20  import com.liferay.portal.kernel.bean.Renderer;
21  import com.liferay.portal.kernel.bean.RendererException;
22  import com.liferay.portal.kernel.exception.SystemException;
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  /**
51   * <a href="RendererImpl.java.html"><b><i>View Source</i></b></a>
52   *
53   * @author Raymond Augé
54   */
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         // Velocity variables
146 
147         try {
148             VelocityVariables.insertVariables(velocityContext, request);
149         }
150         catch (Exception e) {
151             throw new RendererException(e);
152         }
153 
154         velocityContext.put(_BEAN, bean);
155 
156         try {
157             UnsyncStringWriter unsyncStringWriter = new UnsyncStringWriter();
158 
159             VelocityEngineUtil.mergeTemplate(
160                 className, velocityTemplateContent, velocityContext,
161                 unsyncStringWriter);
162 
163             return unsyncStringWriter.toString();
164         }
165         catch (Exception e) {
166             _log.error(e, e);
167 
168             throw new RendererException(e);
169         }
170     }
171 
172     public String renderBean(
173             PortletRequest portletRequest, PortletResponse portletResponse,
174             Object bean)
175         throws RendererException {
176 
177         return renderBean(portletRequest, portletResponse, null, bean, null);
178     }
179 
180     public String renderBean(
181             PortletRequest portletRequest, PortletResponse portletResponse,
182             Object bean, String varientSuffix)
183         throws RendererException {
184 
185         return renderBean(
186             portletRequest, portletResponse, null, bean, varientSuffix);
187     }
188 
189     public String renderBean(
190             PortletRequest portletRequest, PortletResponse portletResponse,
191             String servletContextName, Object bean)
192         throws RendererException {
193 
194         return renderBean(
195             portletRequest, portletResponse, servletContextName, bean, null);
196     }
197 
198     public String renderBean(
199             PortletRequest portletRequest, PortletResponse portletResponse,
200             String servletContextName, Object bean, String varientSuffix)
201         throws RendererException {
202 
203         HttpServletRequest request = PortalUtil.getHttpServletRequest(
204             portletRequest);
205         HttpServletResponse response = PortalUtil.getHttpServletResponse(
206             portletResponse);
207 
208         return renderBean(
209             request, response, servletContextName, bean, varientSuffix);
210     }
211 
212     public String renderEntity(
213             HttpServletRequest request, HttpServletResponse response,
214             String className, Object classPK)
215         throws RendererException {
216 
217         return renderEntity(request, response, null, className, classPK, null);
218     }
219 
220     public String renderEntity(
221             HttpServletRequest request, HttpServletResponse response,
222             String className, Object classPK, String varientSuffix)
223         throws RendererException {
224 
225         return renderEntity(
226             request, response, null, className, classPK, varientSuffix);
227     }
228 
229     public String renderEntity(
230             HttpServletRequest request, HttpServletResponse response,
231             String servletContextName, String className, Object classPK)
232         throws RendererException {
233 
234         return renderEntity(
235             request, response, servletContextName, className, classPK, null);
236     }
237 
238     public String renderEntity(
239             HttpServletRequest request, HttpServletResponse response,
240             String servletContextName, String className, Object classPK,
241             String varientSuffix)
242         throws RendererException {
243 
244         if (Validator.isNull(className)) {
245             return null;
246         }
247 
248         className = _normalizeClassName(className);
249 
250         String[] beanNameParts = StringUtil.split(className, _MODEL);
251 
252         Object serviceBean = null;
253 
254         if (Validator.isNotNull(servletContextName)) {
255             if (servletContextName.startsWith(StringPool.SLASH)) {
256                 servletContextName = servletContextName.substring(1);
257             }
258 
259             try {
260                 serviceBean = PortletBeanLocatorUtil.locate(
261                     servletContextName,
262                     beanNameParts[0] + _SERVICE + beanNameParts[1] +
263                         _LOCAL_SERVICE_UTIL);
264             }
265             catch (NoSuchBeanDefinitionException nsbde) {
266             }
267         }
268         else {
269             try {
270                 serviceBean = PortalBeanLocatorUtil.locate(
271                     beanNameParts[0] + _SERVICE + beanNameParts[1] +
272                         _LOCAL_SERVICE_UTIL);
273             }
274             catch (NoSuchBeanDefinitionException nsbde) {
275             }
276         }
277 
278         Object bean = null;
279 
280         if (serviceBean != null) {
281             Method getMethod = null;
282 
283             try {
284                 getMethod = serviceBean.getClass().getDeclaredMethod(
285                     "get" + beanNameParts[1], classPK.getClass());
286             }
287             catch (Exception e) {
288             }
289 
290             if (getMethod == null) {
291                 try {
292                     getMethod = serviceBean.getClass().getDeclaredMethod(
293                         "get" + beanNameParts[1],
294                         _mapToPrimitive(classPK.getClass()));
295                 }
296                 catch (Exception e) {
297                 }
298             }
299 
300             if (getMethod != null) {
301                 try {
302                     bean = getMethod.invoke(null, classPK);
303                 }
304                 catch (Exception e) {
305                     _log.warn(e.getMessage());
306                 }
307             }
308         }
309 
310         return renderBean(
311             request, response, servletContextName, bean, varientSuffix);
312     }
313 
314     public String renderEntity(
315             PortletRequest portletRequest, PortletResponse portletResponse,
316             String className, Object classPK)
317         throws RendererException {
318 
319         return renderEntity(
320             portletRequest, portletResponse, null, className, classPK, null);
321     }
322 
323     public String renderEntity(
324             PortletRequest portletRequest, PortletResponse portletResponse,
325             String className, Object classPK, String varientSuffix)
326         throws RendererException {
327 
328         return renderEntity(
329             portletRequest, portletResponse, null, className, classPK,
330             varientSuffix);
331     }
332 
333     public String renderEntity(
334             PortletRequest portletRequest, PortletResponse portletResponse,
335             String servletContextName, String className, Object classPK)
336         throws RendererException {
337 
338         return renderEntity(
339             portletRequest, portletResponse, servletContextName, className,
340             classPK, null);
341     }
342 
343     public String renderEntity(
344             PortletRequest portletRequest, PortletResponse portletResponse,
345             String servletContextName, String className, Object classPK,
346             String varientSuffix)
347         throws RendererException {
348 
349         HttpServletRequest request = PortalUtil.getHttpServletRequest(
350             portletRequest);
351         HttpServletResponse response = PortalUtil.getHttpServletResponse(
352             portletResponse);
353 
354         return renderEntity(
355             request, response, servletContextName, className, classPK,
356             varientSuffix);
357     }
358 
359     protected PortletPreferences _getPortletPreferences(
360         HttpServletRequest request) {
361 
362         PortletPreferences preferences = PortalUtil.getPreferences(request);
363 
364         String portletResource = ParamUtil.getString(
365             request, "portletResource");
366 
367         if (Validator.isNotNull(portletResource)) {
368             try {
369                 preferences = PortletPreferencesFactoryUtil.getPortletSetup(
370                     request, portletResource);
371             }
372             catch (SystemException se) {
373             }
374         }
375 
376         return preferences;
377     }
378 
379     protected Class<?> _mapToPrimitive(Class<?> clazz) {
380         Class<?> mapping = clazz;
381 
382         if (clazz == Integer.class) {
383             mapping = int.class;
384         }
385         else if (clazz == Long.class) {
386             mapping = long.class;
387         }
388 
389         return mapping;
390     }
391 
392     protected String _normalizeClassName(String className) {
393         className = StringUtil.replace(
394             className,
395             new String[] {
396                 ".impl.",
397                 "Impl"
398             },
399             new String[] {
400                 StringPool.PERIOD,
401                 StringPool.BLANK
402             }
403         );
404 
405         return className;
406     }
407 
408     private static final String _BEAN = "bean";
409 
410     private static final String _LOCAL_SERVICE_UTIL = "LocalServiceUtil";
411 
412     private static final String _MODEL = ".model.";
413 
414     private static final String _SERVICE = ".service.";
415 
416     private static Log _log = LogFactoryUtil.getLog(RendererImpl.class);
417 
418 }