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