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.template.StringTemplateResource;
029 import com.liferay.portal.kernel.template.Template;
030 import com.liferay.portal.kernel.template.TemplateConstants;
031 import com.liferay.portal.kernel.template.TemplateContextType;
032 import com.liferay.portal.kernel.template.TemplateManagerUtil;
033 import com.liferay.portal.kernel.template.TemplateResource;
034 import com.liferay.portal.kernel.template.URLTemplateResource;
035 import com.liferay.portal.kernel.util.ParamUtil;
036 import com.liferay.portal.kernel.util.PropsUtil;
037 import com.liferay.portal.kernel.util.StringPool;
038 import com.liferay.portal.kernel.util.StringUtil;
039 import com.liferay.portal.kernel.util.Validator;
040 import com.liferay.portal.util.PortalUtil;
041 import com.liferay.portal.util.PrefsPropsUtil;
042 import com.liferay.portlet.PortletPreferencesFactoryUtil;
043
044 import java.lang.reflect.Method;
045
046 import java.net.URL;
047
048 import javax.portlet.PortletPreferences;
049 import javax.portlet.PortletRequest;
050 import javax.portlet.PortletResponse;
051
052 import javax.servlet.http.HttpServletRequest;
053 import javax.servlet.http.HttpServletResponse;
054
055
058 public class RendererImpl implements Renderer {
059
060 public String renderBean(
061 HttpServletRequest request, HttpServletResponse response,
062 Object bean)
063 throws RendererException {
064
065 return renderBean(request, response, null, bean, null);
066 }
067
068 public String renderBean(
069 HttpServletRequest request, HttpServletResponse response,
070 Object bean, String varientSuffix)
071 throws RendererException {
072
073 return renderBean(request, response, null, bean, varientSuffix);
074 }
075
076 public String renderBean(
077 HttpServletRequest request, HttpServletResponse response,
078 String servletContextName, Object bean)
079 throws RendererException {
080
081 return renderBean(request, response, servletContextName, bean, null);
082 }
083
084 public String renderBean(
085 HttpServletRequest request, HttpServletResponse response,
086 String servletContextName, Object bean, String varientSuffix)
087 throws RendererException {
088
089 if (bean == null) {
090 return null;
091 }
092
093 long companyId = PortalUtil.getCompanyId(request);
094
095 String className = normalizeClassName(bean.getClass().getName());
096
097 if (Validator.isNotNull(varientSuffix)) {
098 className = varientSuffix;
099 }
100
101 TemplateResource templateResource = null;
102
103 PortletPreferences preferences = getPortletPreferences(request);
104
105 if (preferences != null) {
106 String velocityTemplateContent = preferences.getValue(
107 RENDERER_TEMPLATE_PREFIX + className, StringPool.BLANK);
108
109 if (Validator.isNotNull(velocityTemplateContent)) {
110 templateResource = new StringTemplateResource(
111 className, velocityTemplateContent);
112 }
113 }
114
115 if ((templateResource == null) &&
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 ClassLoader classLoader = beanLocator.getClassLoader();
127
128 URL url = classLoader.getResource(
129 PropsUtil.get(RENDERER_TEMPLATE_PREFIX + className));
130
131 templateResource = new URLTemplateResource(className, url);
132 }
133 catch (Exception e) {
134 }
135 }
136
137 if (templateResource == null) {
138 try {
139 String velocityTemplateContent = PrefsPropsUtil.getContent(
140 companyId, RENDERER_TEMPLATE_PREFIX + className);
141
142 if (Validator.isNotNull(velocityTemplateContent)) {
143 templateResource = new StringTemplateResource(
144 className, velocityTemplateContent);
145 }
146 }
147 catch (Exception e) {
148 }
149 }
150
151 if (templateResource == null) {
152 _log.warn("No entity renderer template found for " + className);
153
154 return null;
155 }
156
157 try {
158 Template template = TemplateManagerUtil.getTemplate(
159 TemplateConstants.LANG_TYPE_VM, templateResource,
160 TemplateContextType.STANDARD);
161
162 template.prepare(request);
163
164 template.put(_BEAN, bean);
165
166 UnsyncStringWriter unsyncStringWriter = new UnsyncStringWriter();
167
168 template.processTemplate(unsyncStringWriter);
169
170 return unsyncStringWriter.toString();
171 }
172 catch (Exception e) {
173 _log.error(e, e);
174
175 throw new RendererException(e);
176 }
177 }
178
179 public String renderBean(
180 PortletRequest portletRequest, PortletResponse portletResponse,
181 Object bean)
182 throws RendererException {
183
184 return renderBean(portletRequest, portletResponse, null, bean, null);
185 }
186
187 public String renderBean(
188 PortletRequest portletRequest, PortletResponse portletResponse,
189 Object bean, String varientSuffix)
190 throws RendererException {
191
192 return renderBean(
193 portletRequest, portletResponse, null, bean, varientSuffix);
194 }
195
196 public String renderBean(
197 PortletRequest portletRequest, PortletResponse portletResponse,
198 String servletContextName, Object bean)
199 throws RendererException {
200
201 return renderBean(
202 portletRequest, portletResponse, servletContextName, bean, null);
203 }
204
205 public String renderBean(
206 PortletRequest portletRequest, PortletResponse portletResponse,
207 String servletContextName, Object bean, String varientSuffix)
208 throws RendererException {
209
210 HttpServletRequest request = PortalUtil.getHttpServletRequest(
211 portletRequest);
212 HttpServletResponse response = PortalUtil.getHttpServletResponse(
213 portletResponse);
214
215 return renderBean(
216 request, response, servletContextName, bean, varientSuffix);
217 }
218
219 public String renderEntity(
220 HttpServletRequest request, HttpServletResponse response,
221 String className, Object classPK)
222 throws RendererException {
223
224 return renderEntity(request, response, null, className, classPK, null);
225 }
226
227 public String renderEntity(
228 HttpServletRequest request, HttpServletResponse response,
229 String className, Object classPK, String varientSuffix)
230 throws RendererException {
231
232 return renderEntity(
233 request, response, null, className, classPK, varientSuffix);
234 }
235
236 public String renderEntity(
237 HttpServletRequest request, HttpServletResponse response,
238 String servletContextName, String className, Object classPK)
239 throws RendererException {
240
241 return renderEntity(
242 request, response, servletContextName, className, classPK, null);
243 }
244
245 public String renderEntity(
246 HttpServletRequest request, HttpServletResponse response,
247 String servletContextName, String className, Object classPK,
248 String varientSuffix)
249 throws RendererException {
250
251 if (Validator.isNull(className)) {
252 return null;
253 }
254
255 className = normalizeClassName(className);
256
257 String[] beanNameParts = StringUtil.split(className, _MODEL);
258
259 Object serviceBean = null;
260
261 if (Validator.isNotNull(servletContextName)) {
262 if (servletContextName.startsWith(StringPool.SLASH)) {
263 servletContextName = servletContextName.substring(1);
264 }
265
266 try {
267 serviceBean = PortletBeanLocatorUtil.locate(
268 servletContextName,
269 beanNameParts[0] + _SERVICE + beanNameParts[1] +
270 _LOCAL_SERVICE_UTIL);
271 }
272 catch (BeanLocatorException ble) {
273 }
274 }
275 else {
276 try {
277 serviceBean = PortalBeanLocatorUtil.locate(
278 beanNameParts[0] + _SERVICE + beanNameParts[1] +
279 _LOCAL_SERVICE_UTIL);
280 }
281 catch (BeanLocatorException ble) {
282 }
283 }
284
285 Object bean = null;
286
287 if (serviceBean != null) {
288 Method getMethod = null;
289
290 try {
291 getMethod = serviceBean.getClass().getDeclaredMethod(
292 "get" + beanNameParts[1], classPK.getClass());
293 }
294 catch (Exception e) {
295 }
296
297 if (getMethod == null) {
298 try {
299 getMethod = serviceBean.getClass().getDeclaredMethod(
300 "get" + beanNameParts[1],
301 mapToPrimitive(classPK.getClass()));
302 }
303 catch (Exception e) {
304 }
305 }
306
307 if (getMethod != null) {
308 try {
309 bean = getMethod.invoke(null, classPK);
310 }
311 catch (Exception e) {
312 _log.warn(e.getMessage());
313 }
314 }
315 }
316
317 return renderBean(
318 request, response, servletContextName, bean, varientSuffix);
319 }
320
321 public String renderEntity(
322 PortletRequest portletRequest, PortletResponse portletResponse,
323 String className, Object classPK)
324 throws RendererException {
325
326 return renderEntity(
327 portletRequest, portletResponse, null, className, classPK, null);
328 }
329
330 public String renderEntity(
331 PortletRequest portletRequest, PortletResponse portletResponse,
332 String className, Object classPK, String varientSuffix)
333 throws RendererException {
334
335 return renderEntity(
336 portletRequest, portletResponse, null, className, classPK,
337 varientSuffix);
338 }
339
340 public String renderEntity(
341 PortletRequest portletRequest, PortletResponse portletResponse,
342 String servletContextName, String className, Object classPK)
343 throws RendererException {
344
345 return renderEntity(
346 portletRequest, portletResponse, servletContextName, className,
347 classPK, null);
348 }
349
350 public String renderEntity(
351 PortletRequest portletRequest, PortletResponse portletResponse,
352 String servletContextName, String className, Object classPK,
353 String varientSuffix)
354 throws RendererException {
355
356 HttpServletRequest request = PortalUtil.getHttpServletRequest(
357 portletRequest);
358 HttpServletResponse response = PortalUtil.getHttpServletResponse(
359 portletResponse);
360
361 return renderEntity(
362 request, response, servletContextName, className, classPK,
363 varientSuffix);
364 }
365
366 protected PortletPreferences getPortletPreferences(
367 HttpServletRequest request) {
368
369 PortletPreferences preferences = PortalUtil.getPreferences(request);
370
371 String portletResource = ParamUtil.getString(
372 request, "portletResource");
373
374 if (Validator.isNotNull(portletResource)) {
375 try {
376 preferences = PortletPreferencesFactoryUtil.getPortletSetup(
377 request, portletResource);
378 }
379 catch (PortalException pe) {
380 }
381 catch (SystemException se) {
382 }
383 }
384
385 return preferences;
386 }
387
388 protected Class<?> mapToPrimitive(Class<?> clazz) {
389 Class<?> mapping = clazz;
390
391 if (clazz == Integer.class) {
392 mapping = int.class;
393 }
394 else if (clazz == Long.class) {
395 mapping = long.class;
396 }
397
398 return mapping;
399 }
400
401 protected String normalizeClassName(String className) {
402 className = StringUtil.replace(
403 className,
404 new String[] {
405 ".impl.", "Impl"
406 },
407 new String[] {
408 StringPool.PERIOD, StringPool.BLANK
409 }
410 );
411
412 return className;
413 }
414
415 private static final String _BEAN = "bean";
416
417 private static final String _LOCAL_SERVICE_UTIL = "LocalServiceUtil";
418
419 private static final String _MODEL = ".model.";
420
421 private static final String _SERVICE = ".service.";
422
423 private static Log _log = LogFactoryUtil.getLog(RendererImpl.class);
424
425 }