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