001    /**
002     * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.bean;
016    
017    import com.liferay.portal.kernel.bean.BeanLocator;
018    import com.liferay.portal.kernel.bean.BeanLocatorException;
019    import com.liferay.portal.kernel.bean.PortalBeanLocatorUtil;
020    import com.liferay.portal.kernel.bean.PortletBeanLocatorUtil;
021    import com.liferay.portal.kernel.bean.Renderer;
022    import com.liferay.portal.kernel.bean.RendererException;
023    import com.liferay.portal.kernel.exception.PortalException;
024    import com.liferay.portal.kernel.exception.SystemException;
025    import com.liferay.portal.kernel.io.unsync.UnsyncStringWriter;
026    import com.liferay.portal.kernel.log.Log;
027    import com.liferay.portal.kernel.log.LogFactoryUtil;
028    import com.liferay.portal.kernel.template.StringTemplateResource;
029    import com.liferay.portal.kernel.template.Template;
030    import com.liferay.portal.kernel.template.TemplateConstants;
031    import com.liferay.portal.kernel.template.TemplateContextType;
032    import com.liferay.portal.kernel.template.TemplateManagerUtil;
033    import com.liferay.portal.kernel.template.TemplateResource;
034    import com.liferay.portal.kernel.template.URLTemplateResource;
035    import com.liferay.portal.kernel.util.ParamUtil;
036    import com.liferay.portal.kernel.util.PropsUtil;
037    import com.liferay.portal.kernel.util.StringPool;
038    import com.liferay.portal.kernel.util.StringUtil;
039    import com.liferay.portal.kernel.util.Validator;
040    import com.liferay.portal.util.PortalUtil;
041    import com.liferay.portal.util.PrefsPropsUtil;
042    import com.liferay.portlet.PortletPreferencesFactoryUtil;
043    
044    import java.lang.reflect.Method;
045    
046    import java.net.URL;
047    
048    import javax.portlet.PortletPreferences;
049    import javax.portlet.PortletRequest;
050    import javax.portlet.PortletResponse;
051    
052    import javax.servlet.http.HttpServletRequest;
053    import javax.servlet.http.HttpServletResponse;
054    
055    /**
056     * @author Raymond Augé
057     */
058    public class RendererImpl implements Renderer {
059    
060            public String renderBean(
061                            HttpServletRequest request, HttpServletResponse response,
062                            Object bean)
063                    throws RendererException {
064    
065                    return renderBean(request, response, null, bean, null);
066            }
067    
068            public String renderBean(
069                            HttpServletRequest request, HttpServletResponse response,
070                            Object bean, String varientSuffix)
071                    throws RendererException {
072    
073                    return renderBean(request, response, null, bean, varientSuffix);
074            }
075    
076            public String renderBean(
077                            HttpServletRequest request, HttpServletResponse response,
078                            String servletContextName, Object bean)
079                    throws RendererException {
080    
081                    return renderBean(request, response, servletContextName, bean, null);
082            }
083    
084            public String renderBean(
085                            HttpServletRequest request, HttpServletResponse response,
086                            String servletContextName, Object bean, String varientSuffix)
087                    throws RendererException {
088    
089                    if (bean == null) {
090                            return null;
091                    }
092    
093                    long companyId = PortalUtil.getCompanyId(request);
094    
095                    String className = normalizeClassName(bean.getClass().getName());
096    
097                    if (Validator.isNotNull(varientSuffix)) {
098                            className = varientSuffix;
099                    }
100    
101                    TemplateResource templateResource = null;
102    
103                    PortletPreferences preferences = getPortletPreferences(request);
104    
105                    if (preferences != null) {
106                            String velocityTemplateContent = preferences.getValue(
107                                    RENDERER_TEMPLATE_PREFIX + className, StringPool.BLANK);
108    
109                            if (Validator.isNotNull(velocityTemplateContent)) {
110                                    templateResource = new StringTemplateResource(
111                                            className, velocityTemplateContent);
112                            }
113                    }
114    
115                    if ((templateResource == null) &&
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                                    ClassLoader classLoader = beanLocator.getClassLoader();
127    
128                                    URL url = classLoader.getResource(
129                                            PropsUtil.get(RENDERER_TEMPLATE_PREFIX + className));
130    
131                                    templateResource = new URLTemplateResource(className, url);
132                            }
133                            catch (Exception e) {
134                            }
135                    }
136    
137                    if (templateResource == null) {
138                            try {
139                                    String velocityTemplateContent = PrefsPropsUtil.getContent(
140                                            companyId, RENDERER_TEMPLATE_PREFIX + className);
141    
142                                    if (Validator.isNotNull(velocityTemplateContent)) {
143                                            templateResource = new StringTemplateResource(
144                                                    className, velocityTemplateContent);
145                                    }
146                            }
147                            catch (Exception e) {
148                            }
149                    }
150    
151                    if (templateResource == null) {
152                            _log.warn("No entity renderer template found for " + className);
153    
154                            return null;
155                    }
156    
157                    try {
158                            Template template = TemplateManagerUtil.getTemplate(
159                                    TemplateConstants.LANG_TYPE_VM, templateResource,
160                                    TemplateContextType.STANDARD);
161    
162                            template.prepare(request);
163    
164                            template.put(_BEAN, bean);
165    
166                            UnsyncStringWriter unsyncStringWriter = new UnsyncStringWriter();
167    
168                            template.processTemplate(unsyncStringWriter);
169    
170                            return unsyncStringWriter.toString();
171                    }
172                    catch (Exception e) {
173                            _log.error(e, e);
174    
175                            throw new RendererException(e);
176                    }
177            }
178    
179            public String renderBean(
180                            PortletRequest portletRequest, PortletResponse portletResponse,
181                            Object bean)
182                    throws RendererException {
183    
184                    return renderBean(portletRequest, portletResponse, null, bean, null);
185            }
186    
187            public String renderBean(
188                            PortletRequest portletRequest, PortletResponse portletResponse,
189                            Object bean, String varientSuffix)
190                    throws RendererException {
191    
192                    return renderBean(
193                            portletRequest, portletResponse, null, bean, varientSuffix);
194            }
195    
196            public String renderBean(
197                            PortletRequest portletRequest, PortletResponse portletResponse,
198                            String servletContextName, Object bean)
199                    throws RendererException {
200    
201                    return renderBean(
202                            portletRequest, portletResponse, servletContextName, bean, null);
203            }
204    
205            public String renderBean(
206                            PortletRequest portletRequest, PortletResponse portletResponse,
207                            String servletContextName, Object bean, String varientSuffix)
208                    throws RendererException {
209    
210                    HttpServletRequest request = PortalUtil.getHttpServletRequest(
211                            portletRequest);
212                    HttpServletResponse response = PortalUtil.getHttpServletResponse(
213                            portletResponse);
214    
215                    return renderBean(
216                            request, response, servletContextName, bean, varientSuffix);
217            }
218    
219            public String renderEntity(
220                            HttpServletRequest request, HttpServletResponse response,
221                            String className, Object classPK)
222                    throws RendererException {
223    
224                    return renderEntity(request, response, null, className, classPK, null);
225            }
226    
227            public String renderEntity(
228                            HttpServletRequest request, HttpServletResponse response,
229                            String className, Object classPK, String varientSuffix)
230                    throws RendererException {
231    
232                    return renderEntity(
233                            request, response, null, className, classPK, varientSuffix);
234            }
235    
236            public String renderEntity(
237                            HttpServletRequest request, HttpServletResponse response,
238                            String servletContextName, String className, Object classPK)
239                    throws RendererException {
240    
241                    return renderEntity(
242                            request, response, servletContextName, className, classPK, null);
243            }
244    
245            public String renderEntity(
246                            HttpServletRequest request, HttpServletResponse response,
247                            String servletContextName, String className, Object classPK,
248                            String varientSuffix)
249                    throws RendererException {
250    
251                    if (Validator.isNull(className)) {
252                            return null;
253                    }
254    
255                    className = normalizeClassName(className);
256    
257                    String[] beanNameParts = StringUtil.split(className, _MODEL);
258    
259                    Object serviceBean = null;
260    
261                    if (Validator.isNotNull(servletContextName)) {
262                            if (servletContextName.startsWith(StringPool.SLASH)) {
263                                    servletContextName = servletContextName.substring(1);
264                            }
265    
266                            try {
267                                    serviceBean = PortletBeanLocatorUtil.locate(
268                                            servletContextName,
269                                            beanNameParts[0] + _SERVICE + beanNameParts[1] +
270                                                    _LOCAL_SERVICE_UTIL);
271                            }
272                            catch (BeanLocatorException ble) {
273                            }
274                    }
275                    else {
276                            try {
277                                    serviceBean = PortalBeanLocatorUtil.locate(
278                                            beanNameParts[0] + _SERVICE + beanNameParts[1] +
279                                                    _LOCAL_SERVICE_UTIL);
280                            }
281                            catch (BeanLocatorException ble) {
282                            }
283                    }
284    
285                    Object bean = null;
286    
287                    if (serviceBean != null) {
288                            Method getMethod = null;
289    
290                            try {
291                                    getMethod = serviceBean.getClass().getDeclaredMethod(
292                                            "get" + beanNameParts[1], classPK.getClass());
293                            }
294                            catch (Exception e) {
295                            }
296    
297                            if (getMethod == null) {
298                                    try {
299                                            getMethod = serviceBean.getClass().getDeclaredMethod(
300                                                    "get" + beanNameParts[1],
301                                                    mapToPrimitive(classPK.getClass()));
302                                    }
303                                    catch (Exception e) {
304                                    }
305                            }
306    
307                            if (getMethod != null) {
308                                    try {
309                                            bean = getMethod.invoke(null, classPK);
310                                    }
311                                    catch (Exception e) {
312                                            _log.warn(e.getMessage());
313                                    }
314                            }
315                    }
316    
317                    return renderBean(
318                            request, response, servletContextName, bean, varientSuffix);
319            }
320    
321            public String renderEntity(
322                            PortletRequest portletRequest, PortletResponse portletResponse,
323                            String className, Object classPK)
324                    throws RendererException {
325    
326                    return renderEntity(
327                            portletRequest, portletResponse, null, className, classPK, null);
328            }
329    
330            public String renderEntity(
331                            PortletRequest portletRequest, PortletResponse portletResponse,
332                            String className, Object classPK, String varientSuffix)
333                    throws RendererException {
334    
335                    return renderEntity(
336                            portletRequest, portletResponse, null, className, classPK,
337                            varientSuffix);
338            }
339    
340            public String renderEntity(
341                            PortletRequest portletRequest, PortletResponse portletResponse,
342                            String servletContextName, String className, Object classPK)
343                    throws RendererException {
344    
345                    return renderEntity(
346                            portletRequest, portletResponse, servletContextName, className,
347                            classPK, null);
348            }
349    
350            public String renderEntity(
351                            PortletRequest portletRequest, PortletResponse portletResponse,
352                            String servletContextName, String className, Object classPK,
353                            String varientSuffix)
354                    throws RendererException {
355    
356                    HttpServletRequest request = PortalUtil.getHttpServletRequest(
357                            portletRequest);
358                    HttpServletResponse response = PortalUtil.getHttpServletResponse(
359                            portletResponse);
360    
361                    return renderEntity(
362                            request, response, servletContextName, className, classPK,
363                            varientSuffix);
364            }
365    
366            protected PortletPreferences getPortletPreferences(
367                    HttpServletRequest request) {
368    
369                    PortletPreferences preferences = PortalUtil.getPreferences(request);
370    
371                    String portletResource = ParamUtil.getString(
372                            request, "portletResource");
373    
374                    if (Validator.isNotNull(portletResource)) {
375                            try {
376                                    preferences = PortletPreferencesFactoryUtil.getPortletSetup(
377                                            request, portletResource);
378                            }
379                            catch (PortalException pe) {
380                            }
381                            catch (SystemException se) {
382                            }
383                    }
384    
385                    return preferences;
386            }
387    
388            protected Class<?> mapToPrimitive(Class<?> clazz) {
389                    Class<?> mapping = clazz;
390    
391                    if (clazz == Integer.class) {
392                            mapping = int.class;
393                    }
394                    else if (clazz == Long.class) {
395                            mapping = long.class;
396                    }
397    
398                    return mapping;
399            }
400    
401            protected String normalizeClassName(String className) {
402                    className = StringUtil.replace(
403                            className,
404                            new String[] {
405                                    ".impl.", "Impl"
406                            },
407                            new String[] {
408                                    StringPool.PERIOD, StringPool.BLANK
409                            }
410                    );
411    
412                    return className;
413            }
414    
415            private static final String _BEAN = "bean";
416    
417            private static final String _LOCAL_SERVICE_UTIL = "LocalServiceUtil";
418    
419            private static final String _MODEL = ".model.";
420    
421            private static final String _SERVICE = ".service.";
422    
423            private static Log _log = LogFactoryUtil.getLog(RendererImpl.class);
424    
425    }