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 try {
148 VelocityVariables.insertVariables(velocityContext, request);
149 }
150 catch (Exception e) {
151 throw new RendererException(e);
152 }
153
154 velocityContext.put(_BEAN, bean);
155
156 try {
157 UnsyncStringWriter unsyncStringWriter = new UnsyncStringWriter();
158
159 VelocityEngineUtil.mergeTemplate(
160 className, velocityTemplateContent, velocityContext,
161 unsyncStringWriter);
162
163 return unsyncStringWriter.toString();
164 }
165 catch (Exception e) {
166 _log.error(e, e);
167
168 throw new RendererException(e);
169 }
170 }
171
172 public String renderBean(
173 PortletRequest portletRequest, PortletResponse portletResponse,
174 Object bean)
175 throws RendererException {
176
177 return renderBean(portletRequest, portletResponse, null, bean, null);
178 }
179
180 public String renderBean(
181 PortletRequest portletRequest, PortletResponse portletResponse,
182 Object bean, String varientSuffix)
183 throws RendererException {
184
185 return renderBean(
186 portletRequest, portletResponse, null, bean, varientSuffix);
187 }
188
189 public String renderBean(
190 PortletRequest portletRequest, PortletResponse portletResponse,
191 String servletContextName, Object bean)
192 throws RendererException {
193
194 return renderBean(
195 portletRequest, portletResponse, servletContextName, bean, null);
196 }
197
198 public String renderBean(
199 PortletRequest portletRequest, PortletResponse portletResponse,
200 String servletContextName, Object bean, String varientSuffix)
201 throws RendererException {
202
203 HttpServletRequest request = PortalUtil.getHttpServletRequest(
204 portletRequest);
205 HttpServletResponse response = PortalUtil.getHttpServletResponse(
206 portletResponse);
207
208 return renderBean(
209 request, response, servletContextName, bean, varientSuffix);
210 }
211
212 public String renderEntity(
213 HttpServletRequest request, HttpServletResponse response,
214 String className, Object classPK)
215 throws RendererException {
216
217 return renderEntity(request, response, null, className, classPK, null);
218 }
219
220 public String renderEntity(
221 HttpServletRequest request, HttpServletResponse response,
222 String className, Object classPK, String varientSuffix)
223 throws RendererException {
224
225 return renderEntity(
226 request, response, null, className, classPK, varientSuffix);
227 }
228
229 public String renderEntity(
230 HttpServletRequest request, HttpServletResponse response,
231 String servletContextName, String className, Object classPK)
232 throws RendererException {
233
234 return renderEntity(
235 request, response, servletContextName, className, classPK, null);
236 }
237
238 public String renderEntity(
239 HttpServletRequest request, HttpServletResponse response,
240 String servletContextName, String className, Object classPK,
241 String varientSuffix)
242 throws RendererException {
243
244 if (Validator.isNull(className)) {
245 return null;
246 }
247
248 className = _normalizeClassName(className);
249
250 String[] beanNameParts = StringUtil.split(className, _MODEL);
251
252 Object serviceBean = null;
253
254 if (Validator.isNotNull(servletContextName)) {
255 if (servletContextName.startsWith(StringPool.SLASH)) {
256 servletContextName = servletContextName.substring(1);
257 }
258
259 try {
260 serviceBean = PortletBeanLocatorUtil.locate(
261 servletContextName,
262 beanNameParts[0] + _SERVICE + beanNameParts[1] +
263 _LOCAL_SERVICE_UTIL);
264 }
265 catch (NoSuchBeanDefinitionException nsbde) {
266 }
267 }
268 else {
269 try {
270 serviceBean = PortalBeanLocatorUtil.locate(
271 beanNameParts[0] + _SERVICE + beanNameParts[1] +
272 _LOCAL_SERVICE_UTIL);
273 }
274 catch (NoSuchBeanDefinitionException nsbde) {
275 }
276 }
277
278 Object bean = null;
279
280 if (serviceBean != null) {
281 Method getMethod = null;
282
283 try {
284 getMethod = serviceBean.getClass().getDeclaredMethod(
285 "get" + beanNameParts[1], classPK.getClass());
286 }
287 catch (Exception e) {
288 }
289
290 if (getMethod == null) {
291 try {
292 getMethod = serviceBean.getClass().getDeclaredMethod(
293 "get" + beanNameParts[1],
294 _mapToPrimitive(classPK.getClass()));
295 }
296 catch (Exception e) {
297 }
298 }
299
300 if (getMethod != null) {
301 try {
302 bean = getMethod.invoke(null, classPK);
303 }
304 catch (Exception e) {
305 _log.warn(e.getMessage());
306 }
307 }
308 }
309
310 return renderBean(
311 request, response, servletContextName, bean, varientSuffix);
312 }
313
314 public String renderEntity(
315 PortletRequest portletRequest, PortletResponse portletResponse,
316 String className, Object classPK)
317 throws RendererException {
318
319 return renderEntity(
320 portletRequest, portletResponse, null, className, classPK, null);
321 }
322
323 public String renderEntity(
324 PortletRequest portletRequest, PortletResponse portletResponse,
325 String className, Object classPK, String varientSuffix)
326 throws RendererException {
327
328 return renderEntity(
329 portletRequest, portletResponse, null, className, classPK,
330 varientSuffix);
331 }
332
333 public String renderEntity(
334 PortletRequest portletRequest, PortletResponse portletResponse,
335 String servletContextName, String className, Object classPK)
336 throws RendererException {
337
338 return renderEntity(
339 portletRequest, portletResponse, servletContextName, className,
340 classPK, null);
341 }
342
343 public String renderEntity(
344 PortletRequest portletRequest, PortletResponse portletResponse,
345 String servletContextName, String className, Object classPK,
346 String varientSuffix)
347 throws RendererException {
348
349 HttpServletRequest request = PortalUtil.getHttpServletRequest(
350 portletRequest);
351 HttpServletResponse response = PortalUtil.getHttpServletResponse(
352 portletResponse);
353
354 return renderEntity(
355 request, response, servletContextName, className, classPK,
356 varientSuffix);
357 }
358
359 protected PortletPreferences _getPortletPreferences(
360 HttpServletRequest request) {
361
362 PortletPreferences preferences = PortalUtil.getPreferences(request);
363
364 String portletResource = ParamUtil.getString(
365 request, "portletResource");
366
367 if (Validator.isNotNull(portletResource)) {
368 try {
369 preferences = PortletPreferencesFactoryUtil.getPortletSetup(
370 request, portletResource);
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 }