001    /**
002     * Copyright (c) 2000-2011 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
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.util.ParamUtil;
029    import com.liferay.portal.kernel.util.PropsUtil;
030    import com.liferay.portal.kernel.util.StringPool;
031    import com.liferay.portal.kernel.util.StringUtil;
032    import com.liferay.portal.kernel.util.Validator;
033    import com.liferay.portal.kernel.velocity.VelocityContext;
034    import com.liferay.portal.kernel.velocity.VelocityEngineUtil;
035    import com.liferay.portal.kernel.velocity.VelocityVariablesUtil;
036    import com.liferay.portal.util.PortalUtil;
037    import com.liferay.portal.util.PrefsPropsUtil;
038    import com.liferay.portlet.PortletPreferencesFactoryUtil;
039    import com.liferay.util.ContentUtil;
040    
041    import java.lang.reflect.Method;
042    
043    import javax.portlet.PortletPreferences;
044    import javax.portlet.PortletRequest;
045    import javax.portlet.PortletResponse;
046    
047    import javax.servlet.http.HttpServletRequest;
048    import javax.servlet.http.HttpServletResponse;
049    
050    /**
051     * @author Raymond Augé
052     */
053    public class RendererImpl implements Renderer {
054    
055            public String renderBean(
056                            HttpServletRequest request, HttpServletResponse response,
057                            Object bean)
058                    throws RendererException {
059    
060                    return renderBean(request, response, null, bean, null);
061            }
062    
063            public String renderBean(
064                            HttpServletRequest request, HttpServletResponse response,
065                            Object bean, String varientSuffix)
066                    throws RendererException {
067    
068                    return renderBean(request, response, null, bean, varientSuffix);
069            }
070    
071            public String renderBean(
072                            HttpServletRequest request, HttpServletResponse response,
073                            String servletContextName, Object bean)
074                    throws RendererException {
075    
076                    return renderBean(request, response, servletContextName, bean, null);
077            }
078    
079            public String renderBean(
080                            HttpServletRequest request, HttpServletResponse response,
081                            String servletContextName, Object bean, String varientSuffix)
082                    throws RendererException {
083    
084                    if (bean == null) {
085                            return null;
086                    }
087    
088                    long companyId = PortalUtil.getCompanyId(request);
089    
090                    String className = _normalizeClassName(bean.getClass().getName());
091    
092                    if (Validator.isNotNull(varientSuffix)) {
093                            className = varientSuffix;
094                    }
095    
096                    String velocityTemplateContent = null;
097    
098                    PortletPreferences preferences = _getPortletPreferences(request);
099    
100                    if (preferences != null) {
101                            velocityTemplateContent = preferences.getValue(
102                                    RENDERER_TEMPLATE_PREFIX + className, StringPool.BLANK);
103                    }
104    
105                    if (Validator.isNull(velocityTemplateContent) &&
106                            Validator.isNotNull(servletContextName)) {
107    
108                            if (servletContextName.startsWith(StringPool.SLASH)) {
109                                    servletContextName = servletContextName.substring(1);
110                            }
111    
112                            try {
113                                    BeanLocator beanLocator = PortletBeanLocatorUtil.getBeanLocator(
114                                            servletContextName);
115    
116                                    velocityTemplateContent = ContentUtil.get(
117                                            beanLocator.getClassLoader(),
118                                            PropsUtil.get(RENDERER_TEMPLATE_PREFIX + className));
119                            }
120                            catch (Exception e) {
121                            }
122                    }
123    
124                    if (Validator.isNull(velocityTemplateContent)) {
125                            try {
126                                    velocityTemplateContent = PrefsPropsUtil.getContent(
127                                            companyId, RENDERER_TEMPLATE_PREFIX + className);
128                            }
129                            catch (Exception e) {
130                            }
131                    }
132    
133                    if (Validator.isNull(velocityTemplateContent)) {
134                            _log.warn(
135                                    "No entity renderer template found for " + className);
136    
137                            return null;
138                    }
139    
140                    VelocityContext velocityContext =
141                            VelocityEngineUtil.getWrappedStandardToolsContext();
142    
143                    // Velocity variables
144    
145                    try {
146                            VelocityVariablesUtil.insertVariables(velocityContext, request);
147                    }
148                    catch (Exception e) {
149                            throw new RendererException(e);
150                    }
151    
152                    velocityContext.put(_BEAN, bean);
153    
154                    try {
155                            UnsyncStringWriter unsyncStringWriter = new UnsyncStringWriter();
156    
157                            VelocityEngineUtil.mergeTemplate(
158                                    className, velocityTemplateContent, velocityContext,
159                                    unsyncStringWriter);
160    
161                            return unsyncStringWriter.toString();
162                    }
163                    catch (Exception e) {
164                            _log.error(e, e);
165    
166                            throw new RendererException(e);
167                    }
168            }
169    
170            public String renderBean(
171                            PortletRequest portletRequest, PortletResponse portletResponse,
172                            Object bean)
173                    throws RendererException {
174    
175                    return renderBean(portletRequest, portletResponse, null, bean, null);
176            }
177    
178            public String renderBean(
179                            PortletRequest portletRequest, PortletResponse portletResponse,
180                            Object bean, String varientSuffix)
181                    throws RendererException {
182    
183                    return renderBean(
184                            portletRequest, portletResponse, null, bean, varientSuffix);
185            }
186    
187            public String renderBean(
188                            PortletRequest portletRequest, PortletResponse portletResponse,
189                            String servletContextName, Object bean)
190                    throws RendererException {
191    
192                    return renderBean(
193                            portletRequest, portletResponse, servletContextName, bean, null);
194            }
195    
196            public String renderBean(
197                            PortletRequest portletRequest, PortletResponse portletResponse,
198                            String servletContextName, Object bean, String varientSuffix)
199                    throws RendererException {
200    
201                    HttpServletRequest request = PortalUtil.getHttpServletRequest(
202                            portletRequest);
203                    HttpServletResponse response = PortalUtil.getHttpServletResponse(
204                            portletResponse);
205    
206                    return renderBean(
207                            request, response, servletContextName, bean, varientSuffix);
208            }
209    
210            public String renderEntity(
211                            HttpServletRequest request, HttpServletResponse response,
212                            String className, Object classPK)
213                    throws RendererException {
214    
215                    return renderEntity(request, response, null, className, classPK, null);
216            }
217    
218            public String renderEntity(
219                            HttpServletRequest request, HttpServletResponse response,
220                            String className, Object classPK, String varientSuffix)
221                    throws RendererException {
222    
223                    return renderEntity(
224                            request, response, null, className, classPK, varientSuffix);
225            }
226    
227            public String renderEntity(
228                            HttpServletRequest request, HttpServletResponse response,
229                            String servletContextName, String className, Object classPK)
230                    throws RendererException {
231    
232                    return renderEntity(
233                            request, response, servletContextName, className, classPK, null);
234            }
235    
236            public String renderEntity(
237                            HttpServletRequest request, HttpServletResponse response,
238                            String servletContextName, String className, Object classPK,
239                            String varientSuffix)
240                    throws RendererException {
241    
242                    if (Validator.isNull(className)) {
243                            return null;
244                    }
245    
246                    className = _normalizeClassName(className);
247    
248                    String[] beanNameParts = StringUtil.split(className, _MODEL);
249    
250                    Object serviceBean = null;
251    
252                    if (Validator.isNotNull(servletContextName)) {
253                            if (servletContextName.startsWith(StringPool.SLASH)) {
254                                    servletContextName = servletContextName.substring(1);
255                            }
256    
257                            try {
258                                    serviceBean = PortletBeanLocatorUtil.locate(
259                                            servletContextName,
260                                            beanNameParts[0] + _SERVICE + beanNameParts[1] +
261                                                    _LOCAL_SERVICE_UTIL);
262                            }
263                            catch (BeanLocatorException ble) {
264                            }
265                    }
266                    else {
267                            try {
268                                    serviceBean = PortalBeanLocatorUtil.locate(
269                                            beanNameParts[0] + _SERVICE + beanNameParts[1] +
270                                                    _LOCAL_SERVICE_UTIL);
271                            }
272                            catch (BeanLocatorException ble) {
273                            }
274                    }
275    
276                    Object bean = null;
277    
278                    if (serviceBean != null) {
279                            Method getMethod = null;
280    
281                            try {
282                                    getMethod = serviceBean.getClass().getDeclaredMethod(
283                                            "get" + beanNameParts[1], classPK.getClass());
284                            }
285                            catch (Exception e) {
286                            }
287    
288                            if (getMethod == null) {
289                                    try {
290                                            getMethod = serviceBean.getClass().getDeclaredMethod(
291                                                    "get" + beanNameParts[1],
292                                                    _mapToPrimitive(classPK.getClass()));
293                                    }
294                                    catch (Exception e) {
295                                    }
296                            }
297    
298                            if (getMethod != null) {
299                                    try {
300                                            bean = getMethod.invoke(null, classPK);
301                                    }
302                                    catch (Exception e) {
303                                            _log.warn(e.getMessage());
304                                    }
305                            }
306                    }
307    
308                    return renderBean(
309                            request, response, servletContextName, bean, varientSuffix);
310            }
311    
312            public String renderEntity(
313                            PortletRequest portletRequest, PortletResponse portletResponse,
314                            String className, Object classPK)
315                    throws RendererException {
316    
317                    return renderEntity(
318                            portletRequest, portletResponse, null, className, classPK, null);
319            }
320    
321            public String renderEntity(
322                            PortletRequest portletRequest, PortletResponse portletResponse,
323                            String className, Object classPK, String varientSuffix)
324                    throws RendererException {
325    
326                    return renderEntity(
327                            portletRequest, portletResponse, null, className, classPK,
328                            varientSuffix);
329            }
330    
331            public String renderEntity(
332                            PortletRequest portletRequest, PortletResponse portletResponse,
333                            String servletContextName, String className, Object classPK)
334                    throws RendererException {
335    
336                    return renderEntity(
337                            portletRequest, portletResponse, servletContextName, className,
338                            classPK, null);
339            }
340    
341            public String renderEntity(
342                            PortletRequest portletRequest, PortletResponse portletResponse,
343                            String servletContextName, String className, Object classPK,
344                            String varientSuffix)
345                    throws RendererException {
346    
347                    HttpServletRequest request = PortalUtil.getHttpServletRequest(
348                            portletRequest);
349                    HttpServletResponse response = PortalUtil.getHttpServletResponse(
350                            portletResponse);
351    
352                    return renderEntity(
353                            request, response, servletContextName, className, classPK,
354                            varientSuffix);
355            }
356    
357            protected PortletPreferences _getPortletPreferences(
358                    HttpServletRequest request) {
359    
360                    PortletPreferences preferences = PortalUtil.getPreferences(request);
361    
362                    String portletResource = ParamUtil.getString(
363                            request, "portletResource");
364    
365                    if (Validator.isNotNull(portletResource)) {
366                            try {
367                                    preferences = PortletPreferencesFactoryUtil.getPortletSetup(
368                                            request, portletResource);
369                            }
370                            catch (PortalException pe) {
371                            }
372                            catch (SystemException se) {
373                            }
374                    }
375    
376                    return preferences;
377            }
378    
379            protected Class<?> _mapToPrimitive(Class<?> clazz) {
380                    Class<?> mapping = clazz;
381    
382                    if (clazz == Integer.class) {
383                            mapping = int.class;
384                    }
385                    else if (clazz == Long.class) {
386                            mapping = long.class;
387                    }
388    
389                    return mapping;
390            }
391    
392            protected String _normalizeClassName(String className) {
393                    className = StringUtil.replace(
394                            className,
395                            new String[] {
396                                    ".impl.",
397                                    "Impl"
398                            },
399                            new String[] {
400                                    StringPool.PERIOD,
401                                    StringPool.BLANK
402                            }
403                    );
404    
405                    return className;
406            }
407    
408            private static final String _BEAN = "bean";
409    
410            private static final String _LOCAL_SERVICE_UTIL = "LocalServiceUtil";
411    
412            private static final String _MODEL = ".model.";
413    
414            private static final String _SERVICE = ".service.";
415    
416            private static Log _log = LogFactoryUtil.getLog(RendererImpl.class);
417    
418    }