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