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