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