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.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  /**
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         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 }