001
014
015 package com.liferay.portal.bean;
016
017 import com.liferay.portal.kernel.bean.BeanLocator;
018 import com.liferay.portal.kernel.bean.BeanLocatorException;
019 import com.liferay.portal.kernel.bean.PortalBeanLocatorUtil;
020 import com.liferay.portal.kernel.bean.PortletBeanLocatorUtil;
021 import com.liferay.portal.kernel.bean.Renderer;
022 import com.liferay.portal.kernel.bean.RendererException;
023 import com.liferay.portal.kernel.exception.PortalException;
024 import com.liferay.portal.kernel.exception.SystemException;
025 import com.liferay.portal.kernel.io.unsync.UnsyncStringWriter;
026 import com.liferay.portal.kernel.log.Log;
027 import com.liferay.portal.kernel.log.LogFactoryUtil;
028 import com.liferay.portal.kernel.util.ParamUtil;
029 import com.liferay.portal.kernel.util.PropsUtil;
030 import com.liferay.portal.kernel.util.StringPool;
031 import com.liferay.portal.kernel.util.StringUtil;
032 import com.liferay.portal.kernel.util.Validator;
033 import com.liferay.portal.kernel.velocity.VelocityContext;
034 import com.liferay.portal.kernel.velocity.VelocityEngineUtil;
035 import com.liferay.portal.kernel.velocity.VelocityVariablesUtil;
036 import com.liferay.portal.util.PortalUtil;
037 import com.liferay.portal.util.PrefsPropsUtil;
038 import com.liferay.portlet.PortletPreferencesFactoryUtil;
039 import com.liferay.util.ContentUtil;
040
041 import java.lang.reflect.Method;
042
043 import javax.portlet.PortletPreferences;
044 import javax.portlet.PortletRequest;
045 import javax.portlet.PortletResponse;
046
047 import javax.servlet.http.HttpServletRequest;
048 import javax.servlet.http.HttpServletResponse;
049
050
053 public class RendererImpl implements Renderer {
054
055 public String renderBean(
056 HttpServletRequest request, HttpServletResponse response,
057 Object bean)
058 throws RendererException {
059
060 return renderBean(request, response, null, bean, null);
061 }
062
063 public String renderBean(
064 HttpServletRequest request, HttpServletResponse response,
065 Object bean, String varientSuffix)
066 throws RendererException {
067
068 return renderBean(request, response, null, bean, varientSuffix);
069 }
070
071 public String renderBean(
072 HttpServletRequest request, HttpServletResponse response,
073 String servletContextName, Object bean)
074 throws RendererException {
075
076 return renderBean(request, response, servletContextName, bean, null);
077 }
078
079 public String renderBean(
080 HttpServletRequest request, HttpServletResponse response,
081 String servletContextName, Object bean, String varientSuffix)
082 throws RendererException {
083
084 if (bean == null) {
085 return null;
086 }
087
088 long companyId = PortalUtil.getCompanyId(request);
089
090 String className = _normalizeClassName(bean.getClass().getName());
091
092 if (Validator.isNotNull(varientSuffix)) {
093 className = varientSuffix;
094 }
095
096 String velocityTemplateContent = null;
097
098 PortletPreferences preferences = _getPortletPreferences(request);
099
100 if (preferences != null) {
101 velocityTemplateContent = preferences.getValue(
102 RENDERER_TEMPLATE_PREFIX + className, StringPool.BLANK);
103 }
104
105 if (Validator.isNull(velocityTemplateContent) &&
106 Validator.isNotNull(servletContextName)) {
107
108 if (servletContextName.startsWith(StringPool.SLASH)) {
109 servletContextName = servletContextName.substring(1);
110 }
111
112 try {
113 BeanLocator beanLocator = PortletBeanLocatorUtil.getBeanLocator(
114 servletContextName);
115
116 velocityTemplateContent = ContentUtil.get(
117 beanLocator.getClassLoader(),
118 PropsUtil.get(RENDERER_TEMPLATE_PREFIX + className));
119 }
120 catch (Exception e) {
121 }
122 }
123
124 if (Validator.isNull(velocityTemplateContent)) {
125 try {
126 velocityTemplateContent = PrefsPropsUtil.getContent(
127 companyId, RENDERER_TEMPLATE_PREFIX + className);
128 }
129 catch (Exception e) {
130 }
131 }
132
133 if (Validator.isNull(velocityTemplateContent)) {
134 _log.warn(
135 "No entity renderer template found for " + className);
136
137 return null;
138 }
139
140 VelocityContext velocityContext =
141 VelocityEngineUtil.getWrappedStandardToolsContext();
142
143
144
145 try {
146 VelocityVariablesUtil.insertVariables(velocityContext, request);
147 }
148 catch (Exception e) {
149 throw new RendererException(e);
150 }
151
152 velocityContext.put(_BEAN, bean);
153
154 try {
155 UnsyncStringWriter unsyncStringWriter = new UnsyncStringWriter();
156
157 VelocityEngineUtil.mergeTemplate(
158 className, velocityTemplateContent, velocityContext,
159 unsyncStringWriter);
160
161 return unsyncStringWriter.toString();
162 }
163 catch (Exception e) {
164 _log.error(e, e);
165
166 throw new RendererException(e);
167 }
168 }
169
170 public String renderBean(
171 PortletRequest portletRequest, PortletResponse portletResponse,
172 Object bean)
173 throws RendererException {
174
175 return renderBean(portletRequest, portletResponse, null, bean, null);
176 }
177
178 public String renderBean(
179 PortletRequest portletRequest, PortletResponse portletResponse,
180 Object bean, String varientSuffix)
181 throws RendererException {
182
183 return renderBean(
184 portletRequest, portletResponse, null, bean, varientSuffix);
185 }
186
187 public String renderBean(
188 PortletRequest portletRequest, PortletResponse portletResponse,
189 String servletContextName, Object bean)
190 throws RendererException {
191
192 return renderBean(
193 portletRequest, portletResponse, servletContextName, bean, null);
194 }
195
196 public String renderBean(
197 PortletRequest portletRequest, PortletResponse portletResponse,
198 String servletContextName, Object bean, String varientSuffix)
199 throws RendererException {
200
201 HttpServletRequest request = PortalUtil.getHttpServletRequest(
202 portletRequest);
203 HttpServletResponse response = PortalUtil.getHttpServletResponse(
204 portletResponse);
205
206 return renderBean(
207 request, response, servletContextName, bean, varientSuffix);
208 }
209
210 public String renderEntity(
211 HttpServletRequest request, HttpServletResponse response,
212 String className, Object classPK)
213 throws RendererException {
214
215 return renderEntity(request, response, null, className, classPK, null);
216 }
217
218 public String renderEntity(
219 HttpServletRequest request, HttpServletResponse response,
220 String className, Object classPK, String varientSuffix)
221 throws RendererException {
222
223 return renderEntity(
224 request, response, null, className, classPK, varientSuffix);
225 }
226
227 public String renderEntity(
228 HttpServletRequest request, HttpServletResponse response,
229 String servletContextName, String className, Object classPK)
230 throws RendererException {
231
232 return renderEntity(
233 request, response, servletContextName, className, classPK, null);
234 }
235
236 public String renderEntity(
237 HttpServletRequest request, HttpServletResponse response,
238 String servletContextName, String className, Object classPK,
239 String varientSuffix)
240 throws RendererException {
241
242 if (Validator.isNull(className)) {
243 return null;
244 }
245
246 className = _normalizeClassName(className);
247
248 String[] beanNameParts = StringUtil.split(className, _MODEL);
249
250 Object serviceBean = null;
251
252 if (Validator.isNotNull(servletContextName)) {
253 if (servletContextName.startsWith(StringPool.SLASH)) {
254 servletContextName = servletContextName.substring(1);
255 }
256
257 try {
258 serviceBean = PortletBeanLocatorUtil.locate(
259 servletContextName,
260 beanNameParts[0] + _SERVICE + beanNameParts[1] +
261 _LOCAL_SERVICE_UTIL);
262 }
263 catch (BeanLocatorException ble) {
264 }
265 }
266 else {
267 try {
268 serviceBean = PortalBeanLocatorUtil.locate(
269 beanNameParts[0] + _SERVICE + beanNameParts[1] +
270 _LOCAL_SERVICE_UTIL);
271 }
272 catch (BeanLocatorException ble) {
273 }
274 }
275
276 Object bean = null;
277
278 if (serviceBean != null) {
279 Method getMethod = null;
280
281 try {
282 getMethod = serviceBean.getClass().getDeclaredMethod(
283 "get" + beanNameParts[1], classPK.getClass());
284 }
285 catch (Exception e) {
286 }
287
288 if (getMethod == null) {
289 try {
290 getMethod = serviceBean.getClass().getDeclaredMethod(
291 "get" + beanNameParts[1],
292 _mapToPrimitive(classPK.getClass()));
293 }
294 catch (Exception e) {
295 }
296 }
297
298 if (getMethod != null) {
299 try {
300 bean = getMethod.invoke(null, classPK);
301 }
302 catch (Exception e) {
303 _log.warn(e.getMessage());
304 }
305 }
306 }
307
308 return renderBean(
309 request, response, servletContextName, bean, varientSuffix);
310 }
311
312 public String renderEntity(
313 PortletRequest portletRequest, PortletResponse portletResponse,
314 String className, Object classPK)
315 throws RendererException {
316
317 return renderEntity(
318 portletRequest, portletResponse, null, className, classPK, null);
319 }
320
321 public String renderEntity(
322 PortletRequest portletRequest, PortletResponse portletResponse,
323 String className, Object classPK, String varientSuffix)
324 throws RendererException {
325
326 return renderEntity(
327 portletRequest, portletResponse, null, className, classPK,
328 varientSuffix);
329 }
330
331 public String renderEntity(
332 PortletRequest portletRequest, PortletResponse portletResponse,
333 String servletContextName, String className, Object classPK)
334 throws RendererException {
335
336 return renderEntity(
337 portletRequest, portletResponse, servletContextName, className,
338 classPK, null);
339 }
340
341 public String renderEntity(
342 PortletRequest portletRequest, PortletResponse portletResponse,
343 String servletContextName, String className, Object classPK,
344 String varientSuffix)
345 throws RendererException {
346
347 HttpServletRequest request = PortalUtil.getHttpServletRequest(
348 portletRequest);
349 HttpServletResponse response = PortalUtil.getHttpServletResponse(
350 portletResponse);
351
352 return renderEntity(
353 request, response, servletContextName, className, classPK,
354 varientSuffix);
355 }
356
357 protected PortletPreferences _getPortletPreferences(
358 HttpServletRequest request) {
359
360 PortletPreferences preferences = PortalUtil.getPreferences(request);
361
362 String portletResource = ParamUtil.getString(
363 request, "portletResource");
364
365 if (Validator.isNotNull(portletResource)) {
366 try {
367 preferences = PortletPreferencesFactoryUtil.getPortletSetup(
368 request, portletResource);
369 }
370 catch (PortalException pe) {
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 }