1
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
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
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 }