1
14
15 package com.liferay.portal.bean;
16
17 import com.liferay.portal.kernel.bean.BeanLocator;
18 import com.liferay.portal.kernel.bean.BeanLocatorException;
19 import com.liferay.portal.kernel.bean.PortalBeanLocatorUtil;
20 import com.liferay.portal.kernel.bean.PortletBeanLocatorUtil;
21 import com.liferay.portal.kernel.bean.Renderer;
22 import com.liferay.portal.kernel.bean.RendererException;
23 import com.liferay.portal.kernel.exception.SystemException;
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 try {
147 VelocityVariables.insertVariables(velocityContext, request);
148 }
149 catch (Exception e) {
150 throw new RendererException(e);
151 }
152
153 velocityContext.put(_BEAN, bean);
154
155 try {
156 UnsyncStringWriter unsyncStringWriter = new UnsyncStringWriter();
157
158 VelocityEngineUtil.mergeTemplate(
159 className, velocityTemplateContent, velocityContext,
160 unsyncStringWriter);
161
162 return unsyncStringWriter.toString();
163 }
164 catch (Exception e) {
165 _log.error(e, e);
166
167 throw new RendererException(e);
168 }
169 }
170
171 public String renderBean(
172 PortletRequest portletRequest, PortletResponse portletResponse,
173 Object bean)
174 throws RendererException {
175
176 return renderBean(portletRequest, portletResponse, null, bean, null);
177 }
178
179 public String renderBean(
180 PortletRequest portletRequest, PortletResponse portletResponse,
181 Object bean, String varientSuffix)
182 throws RendererException {
183
184 return renderBean(
185 portletRequest, portletResponse, null, bean, varientSuffix);
186 }
187
188 public String renderBean(
189 PortletRequest portletRequest, PortletResponse portletResponse,
190 String servletContextName, Object bean)
191 throws RendererException {
192
193 return renderBean(
194 portletRequest, portletResponse, servletContextName, bean, null);
195 }
196
197 public String renderBean(
198 PortletRequest portletRequest, PortletResponse portletResponse,
199 String servletContextName, Object bean, String varientSuffix)
200 throws RendererException {
201
202 HttpServletRequest request = PortalUtil.getHttpServletRequest(
203 portletRequest);
204 HttpServletResponse response = PortalUtil.getHttpServletResponse(
205 portletResponse);
206
207 return renderBean(
208 request, response, servletContextName, bean, varientSuffix);
209 }
210
211 public String renderEntity(
212 HttpServletRequest request, HttpServletResponse response,
213 String className, Object classPK)
214 throws RendererException {
215
216 return renderEntity(request, response, null, className, classPK, null);
217 }
218
219 public String renderEntity(
220 HttpServletRequest request, HttpServletResponse response,
221 String className, Object classPK, String varientSuffix)
222 throws RendererException {
223
224 return renderEntity(
225 request, response, null, className, classPK, varientSuffix);
226 }
227
228 public String renderEntity(
229 HttpServletRequest request, HttpServletResponse response,
230 String servletContextName, String className, Object classPK)
231 throws RendererException {
232
233 return renderEntity(
234 request, response, servletContextName, className, classPK, null);
235 }
236
237 public String renderEntity(
238 HttpServletRequest request, HttpServletResponse response,
239 String servletContextName, String className, Object classPK,
240 String varientSuffix)
241 throws RendererException {
242
243 if (Validator.isNull(className)) {
244 return null;
245 }
246
247 className = _normalizeClassName(className);
248
249 String[] beanNameParts = StringUtil.split(className, _MODEL);
250
251 Object serviceBean = null;
252
253 if (Validator.isNotNull(servletContextName)) {
254 if (servletContextName.startsWith(StringPool.SLASH)) {
255 servletContextName = servletContextName.substring(1);
256 }
257
258 try {
259 serviceBean = PortletBeanLocatorUtil.locate(
260 servletContextName,
261 beanNameParts[0] + _SERVICE + beanNameParts[1] +
262 _LOCAL_SERVICE_UTIL);
263 }
264 catch (BeanLocatorException ble) {
265 }
266 }
267 else {
268 try {
269 serviceBean = PortalBeanLocatorUtil.locate(
270 beanNameParts[0] + _SERVICE + beanNameParts[1] +
271 _LOCAL_SERVICE_UTIL);
272 }
273 catch (BeanLocatorException ble) {
274 }
275 }
276
277 Object bean = null;
278
279 if (serviceBean != null) {
280 Method getMethod = null;
281
282 try {
283 getMethod = serviceBean.getClass().getDeclaredMethod(
284 "get" + beanNameParts[1], classPK.getClass());
285 }
286 catch (Exception e) {
287 }
288
289 if (getMethod == null) {
290 try {
291 getMethod = serviceBean.getClass().getDeclaredMethod(
292 "get" + beanNameParts[1],
293 _mapToPrimitive(classPK.getClass()));
294 }
295 catch (Exception e) {
296 }
297 }
298
299 if (getMethod != null) {
300 try {
301 bean = getMethod.invoke(null, classPK);
302 }
303 catch (Exception e) {
304 _log.warn(e.getMessage());
305 }
306 }
307 }
308
309 return renderBean(
310 request, response, servletContextName, bean, varientSuffix);
311 }
312
313 public String renderEntity(
314 PortletRequest portletRequest, PortletResponse portletResponse,
315 String className, Object classPK)
316 throws RendererException {
317
318 return renderEntity(
319 portletRequest, portletResponse, null, className, classPK, null);
320 }
321
322 public String renderEntity(
323 PortletRequest portletRequest, PortletResponse portletResponse,
324 String className, Object classPK, String varientSuffix)
325 throws RendererException {
326
327 return renderEntity(
328 portletRequest, portletResponse, null, className, classPK,
329 varientSuffix);
330 }
331
332 public String renderEntity(
333 PortletRequest portletRequest, PortletResponse portletResponse,
334 String servletContextName, String className, Object classPK)
335 throws RendererException {
336
337 return renderEntity(
338 portletRequest, portletResponse, servletContextName, className,
339 classPK, null);
340 }
341
342 public String renderEntity(
343 PortletRequest portletRequest, PortletResponse portletResponse,
344 String servletContextName, String className, Object classPK,
345 String varientSuffix)
346 throws RendererException {
347
348 HttpServletRequest request = PortalUtil.getHttpServletRequest(
349 portletRequest);
350 HttpServletResponse response = PortalUtil.getHttpServletResponse(
351 portletResponse);
352
353 return renderEntity(
354 request, response, servletContextName, className, classPK,
355 varientSuffix);
356 }
357
358 protected PortletPreferences _getPortletPreferences(
359 HttpServletRequest request) {
360
361 PortletPreferences preferences = PortalUtil.getPreferences(request);
362
363 String portletResource = ParamUtil.getString(
364 request, "portletResource");
365
366 if (Validator.isNotNull(portletResource)) {
367 try {
368 preferences = PortletPreferencesFactoryUtil.getPortletSetup(
369 request, portletResource);
370 }
371 catch (SystemException se) {
372 }
373 }
374
375 return preferences;
376 }
377
378 protected Class<?> _mapToPrimitive(Class<?> clazz) {
379 Class<?> mapping = clazz;
380
381 if (clazz == Integer.class) {
382 mapping = int.class;
383 }
384 else if (clazz == Long.class) {
385 mapping = long.class;
386 }
387
388 return mapping;
389 }
390
391 protected String _normalizeClassName(String className) {
392 className = StringUtil.replace(
393 className,
394 new String[] {
395 ".impl.",
396 "Impl"
397 },
398 new String[] {
399 StringPool.PERIOD,
400 StringPool.BLANK
401 }
402 );
403
404 return className;
405 }
406
407 private static final String _BEAN = "bean";
408
409 private static final String _LOCAL_SERVICE_UTIL = "LocalServiceUtil";
410
411 private static final String _MODEL = ".model.";
412
413 private static final String _SERVICE = ".service.";
414
415 private static Log _log = LogFactoryUtil.getLog(RendererImpl.class);
416
417 }