1
14
15 package com.liferay.portal.bean;
16
17 import com.liferay.portal.SystemException;
18 import com.liferay.portal.kernel.bean.BeanLocator;
19 import com.liferay.portal.kernel.bean.BeanLocatorException;
20 import com.liferay.portal.kernel.bean.PortalBeanLocatorUtil;
21 import com.liferay.portal.kernel.bean.PortletBeanLocatorUtil;
22 import com.liferay.portal.kernel.bean.Renderer;
23 import com.liferay.portal.kernel.bean.RendererException;
24 import com.liferay.portal.kernel.io.unsync.UnsyncStringWriter;
25 import com.liferay.portal.kernel.log.Log;
26 import com.liferay.portal.kernel.log.LogFactoryUtil;
27 import com.liferay.portal.kernel.util.ParamUtil;
28 import com.liferay.portal.kernel.util.PropsUtil;
29 import com.liferay.portal.kernel.util.StringPool;
30 import com.liferay.portal.kernel.util.StringUtil;
31 import com.liferay.portal.kernel.util.Validator;
32 import com.liferay.portal.kernel.velocity.VelocityContext;
33 import com.liferay.portal.kernel.velocity.VelocityEngineUtil;
34 import com.liferay.portal.util.ContentUtil;
35 import com.liferay.portal.util.PortalUtil;
36 import com.liferay.portal.util.PrefsPropsUtil;
37 import com.liferay.portal.velocity.VelocityVariables;
38 import com.liferay.portlet.PortletPreferencesFactoryUtil;
39
40 import java.lang.reflect.Method;
41
42 import javax.portlet.PortletPreferences;
43 import javax.portlet.PortletRequest;
44 import javax.portlet.PortletResponse;
45
46 import javax.servlet.http.HttpServletRequest;
47 import javax.servlet.http.HttpServletResponse;
48
49
54 public class RendererImpl implements Renderer {
55
56 public String renderBean(
57 HttpServletRequest request, HttpServletResponse response,
58 Object bean)
59 throws RendererException {
60
61 return renderBean(request, response, null, bean, null);
62 }
63
64 public String renderBean(
65 HttpServletRequest request, HttpServletResponse response,
66 Object bean, String varientSuffix)
67 throws RendererException {
68
69 return renderBean(request, response, null, bean, varientSuffix);
70 }
71
72 public String renderBean(
73 HttpServletRequest request, HttpServletResponse response,
74 String servletContextName, Object bean)
75 throws RendererException {
76
77 return renderBean(request, response, servletContextName, bean, null);
78 }
79
80 public String renderBean(
81 HttpServletRequest request, HttpServletResponse response,
82 String servletContextName, Object bean, String varientSuffix)
83 throws RendererException {
84
85 if (bean == null) {
86 return null;
87 }
88
89 long companyId = PortalUtil.getCompanyId(request);
90
91 String className = _normalizeClassName(bean.getClass().getName());
92
93 if (Validator.isNotNull(varientSuffix)) {
94 className = varientSuffix;
95 }
96
97 String velocityTemplateContent = null;
98
99 PortletPreferences preferences = _getPortletPreferences(request);
100
101 if (preferences != null) {
102 velocityTemplateContent = preferences.getValue(
103 RENDERER_TEMPLATE_PREFIX + className, StringPool.BLANK);
104 }
105
106 if (Validator.isNull(velocityTemplateContent) &&
107 Validator.isNotNull(servletContextName)) {
108
109 if (servletContextName.startsWith(StringPool.SLASH)) {
110 servletContextName = servletContextName.substring(1);
111 }
112
113 try {
114 BeanLocator beanLocator = PortletBeanLocatorUtil.getBeanLocator(
115 servletContextName);
116
117 velocityTemplateContent = ContentUtil.get(
118 beanLocator.getClassLoader(),
119 PropsUtil.get(RENDERER_TEMPLATE_PREFIX + className));
120 }
121 catch (Exception e) {
122 }
123 }
124
125 if (Validator.isNull(velocityTemplateContent)) {
126 try {
127 velocityTemplateContent = PrefsPropsUtil.getContent(
128 companyId, RENDERER_TEMPLATE_PREFIX + className);
129 }
130 catch (Exception e) {
131 }
132 }
133
134 if (Validator.isNull(velocityTemplateContent)) {
135 _log.warn(
136 "No entity renderer template found for " + className);
137
138 return null;
139 }
140
141 VelocityContext velocityContext =
142 VelocityEngineUtil.getWrappedStandardToolsContext();
143
144
146 VelocityVariables.insertVariables(velocityContext, request);
147
148 velocityContext.put(_BEAN, bean);
149
150 try {
151 UnsyncStringWriter unsyncStringWriter = new UnsyncStringWriter();
152
153 VelocityEngineUtil.mergeTemplate(
154 className, velocityTemplateContent, velocityContext,
155 unsyncStringWriter);
156
157 return unsyncStringWriter.toString();
158 }
159 catch (Exception e) {
160 _log.error(e, e);
161
162 throw new RendererException(e);
163 }
164 }
165
166 public String renderBean(
167 PortletRequest portletRequest, PortletResponse portletResponse,
168 Object bean)
169 throws RendererException {
170
171 return renderBean(portletRequest, portletResponse, null, bean, null);
172 }
173
174 public String renderBean(
175 PortletRequest portletRequest, PortletResponse portletResponse,
176 Object bean, String varientSuffix)
177 throws RendererException {
178
179 return renderBean(
180 portletRequest, portletResponse, null, bean, varientSuffix);
181 }
182
183 public String renderBean(
184 PortletRequest portletRequest, PortletResponse portletResponse,
185 String servletContextName, Object bean)
186 throws RendererException {
187
188 return renderBean(
189 portletRequest, portletResponse, servletContextName, bean, null);
190 }
191
192 public String renderBean(
193 PortletRequest portletRequest, PortletResponse portletResponse,
194 String servletContextName, Object bean, String varientSuffix)
195 throws RendererException {
196
197 HttpServletRequest request = PortalUtil.getHttpServletRequest(
198 portletRequest);
199 HttpServletResponse response = PortalUtil.getHttpServletResponse(
200 portletResponse);
201
202 return renderBean(
203 request, response, servletContextName, bean, varientSuffix);
204 }
205
206 public String renderEntity(
207 HttpServletRequest request, HttpServletResponse response,
208 String className, Object classPK)
209 throws RendererException {
210
211 return renderEntity(request, response, null, className, classPK, null);
212 }
213
214 public String renderEntity(
215 HttpServletRequest request, HttpServletResponse response,
216 String className, Object classPK, String varientSuffix)
217 throws RendererException {
218
219 return renderEntity(
220 request, response, null, className, classPK, varientSuffix);
221 }
222
223 public String renderEntity(
224 HttpServletRequest request, HttpServletResponse response,
225 String servletContextName, String className, Object classPK)
226 throws RendererException {
227
228 return renderEntity(
229 request, response, servletContextName, className, classPK, null);
230 }
231
232 public String renderEntity(
233 HttpServletRequest request, HttpServletResponse response,
234 String servletContextName, String className, Object classPK,
235 String varientSuffix)
236 throws RendererException {
237
238 if (Validator.isNull(className)) {
239 return null;
240 }
241
242 className = _normalizeClassName(className);
243
244 String[] beanNameParts = StringUtil.split(className, _MODEL);
245
246 Object serviceBean = null;
247
248 if (Validator.isNotNull(servletContextName)) {
249 if (servletContextName.startsWith(StringPool.SLASH)) {
250 servletContextName = servletContextName.substring(1);
251 }
252
253 try {
254 serviceBean = PortletBeanLocatorUtil.locate(
255 servletContextName,
256 beanNameParts[0] + _SERVICE + beanNameParts[1] +
257 _LOCAL_SERVICE_UTIL);
258 }
259 catch (BeanLocatorException ble) {
260 }
261 }
262 else {
263 try {
264 serviceBean = PortalBeanLocatorUtil.locate(
265 beanNameParts[0] + _SERVICE + beanNameParts[1] +
266 _LOCAL_SERVICE_UTIL);
267 }
268 catch (BeanLocatorException ble) {
269 }
270 }
271
272 Object bean = null;
273
274 if (serviceBean != null) {
275 Method getMethod = null;
276
277 try {
278 getMethod = serviceBean.getClass().getDeclaredMethod(
279 "get" + beanNameParts[1], classPK.getClass());
280 }
281 catch (Exception e) {
282 }
283
284 if (getMethod == null) {
285 try {
286 getMethod = serviceBean.getClass().getDeclaredMethod(
287 "get" + beanNameParts[1],
288 _mapToPrimitive(classPK.getClass()));
289 }
290 catch (Exception e) {
291 }
292 }
293
294 if (getMethod != null) {
295 try {
296 bean = getMethod.invoke(null, classPK);
297 }
298 catch (Exception e) {
299 _log.warn(e.getMessage());
300 }
301 }
302 }
303
304 return renderBean(
305 request, response, servletContextName, bean, varientSuffix);
306 }
307
308 public String renderEntity(
309 PortletRequest portletRequest, PortletResponse portletResponse,
310 String className, Object classPK)
311 throws RendererException {
312
313 return renderEntity(
314 portletRequest, portletResponse, null, className, classPK, null);
315 }
316
317 public String renderEntity(
318 PortletRequest portletRequest, PortletResponse portletResponse,
319 String className, Object classPK, String varientSuffix)
320 throws RendererException {
321
322 return renderEntity(
323 portletRequest, portletResponse, null, className, classPK,
324 varientSuffix);
325 }
326
327 public String renderEntity(
328 PortletRequest portletRequest, PortletResponse portletResponse,
329 String servletContextName, String className, Object classPK)
330 throws RendererException {
331
332 return renderEntity(
333 portletRequest, portletResponse, servletContextName, className,
334 classPK, null);
335 }
336
337 public String renderEntity(
338 PortletRequest portletRequest, PortletResponse portletResponse,
339 String servletContextName, String className, Object classPK,
340 String varientSuffix)
341 throws RendererException {
342
343 HttpServletRequest request = PortalUtil.getHttpServletRequest(
344 portletRequest);
345 HttpServletResponse response = PortalUtil.getHttpServletResponse(
346 portletResponse);
347
348 return renderEntity(
349 request, response, servletContextName, className, classPK,
350 varientSuffix);
351 }
352
353 protected PortletPreferences _getPortletPreferences(
354 HttpServletRequest request) {
355
356 PortletPreferences preferences = PortalUtil.getPreferences(request);
357
358 String portletResource = ParamUtil.getString(
359 request, "portletResource");
360
361 if (Validator.isNotNull(portletResource)) {
362 try {
363 preferences = PortletPreferencesFactoryUtil.getPortletSetup(
364 request, portletResource);
365 }
366 catch (SystemException se) {
367 }
368 }
369
370 return preferences;
371 }
372
373 protected Class<?> _mapToPrimitive(Class<?> clazz) {
374 Class<?> mapping = clazz;
375
376 if (clazz == Integer.class) {
377 mapping = int.class;
378 }
379 else if (clazz == Long.class) {
380 mapping = long.class;
381 }
382
383 return mapping;
384 }
385
386 protected String _normalizeClassName(String className) {
387 className = StringUtil.replace(
388 className,
389 new String[] {
390 ".impl.",
391 "Impl"
392 },
393 new String[] {
394 StringPool.PERIOD,
395 StringPool.BLANK
396 }
397 );
398
399 return className;
400 }
401
402 private static final String _BEAN = "bean";
403
404 private static final String _LOCAL_SERVICE_UTIL = "LocalServiceUtil";
405
406 private static final String _MODEL = ".model.";
407
408 private static final String _SERVICE = ".service.";
409
410 private static Log _log = LogFactoryUtil.getLog(RendererImpl.class);
411
412 }